Создайте скрипт для перемещения файлов, игнорирующий ошибки

Создайте скрипт для перемещения файлов, игнорирующий ошибки

Я могу достаточно легко перемещать файлы в терминале. У меня куча всего, что студенты присылают ежедневно, и мне было бы намного проще иметь одну вещь, которую я мог бы запустить вечером и которая перемещала бы все отправленные фотографии (обычно JPG и PNG) в один каталог, а все текстовые материалы — в другой.

Я мог бы написать что-то простое с помощью mv *.jpgтаких команд, но если там нет ни одного из этих типов файлов, то я предполагаю, что весь скрипт потерпит неудачу, и все усилия по экономии времени будут бессмысленными.

Чтобы добавить сложности, несколько моих старших студентов присылают свои работы в zip-архивах, поэтому я хотел бы иметь возможность заставить скрипт извлечь их в первую очередь.

Итак, вкратце — извлекайте zip-архивы и перемещайте файлы, не останавливаясь из-за ошибок, вызванных отсутствием определенного типа файла.

решение1

Я предполагаю, что весь сценарий потерпит неудачу.

Этого не произойдет, только эта единственная команда "потерпит неудачу" (то есть *.jpgшаблон подстановки будет расширен до литерала *.jpg, что заставит команду выдать ошибку в случае, если файл с таким именем *.jpgне существует), но скрипт продолжит выполняться, несмотря на ошибку. Так что в большинстве случаев это не проблема, однако, если вы хотите делать все The Right Way™, включите failglobперед запуском команд, содержащих шаблоны подстановки:

shopt -s failglob

ОтСправочное руководство Bash: Расширение имени файла:

Если failglobпараметр оболочки установлен и совпадений не найдено, выводится сообщение об ошибке и команда не выполняется.

Чтобы извлечь все .zip-файлы из текущего рабочего каталога в один каталог:

unzip '*.zip' -d /path/to/target/directory

Обратите внимание, что *.zipон заключен в одинарные кавычки, поэтому unzipшаблон можно развернуть самостоятельно (в противном случае команда не будет выполнена).

Собираем все воедино:

#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory

решение2

Достаточно иметь 3 команды, которые используют find SOURCE_FOLDER -type f -exec COMMAND {} \;структуру. Ниже представлен скрипт, который объединяет все 3. Каждая команда завершит работу без вывода сообщений, если файлы не будут найдены — вот и все; это означает, что если у вас есть файлы png, но нет файлов jpeg, вы все равно переместите png туда, где они должны быть, без ошибок.

Вот небольшая демонстрация, где вы можете видеть, что у меня есть 2 файла изображений и 1 zip-файл. Скрипт распаковывает архив, а затем собирает все png и jpeg и кидает в соответствующие каталоги

$> ls
JPEGS/  Pictures.zip  PNGS/  rMzMHd7.jpg  waves.png*
$> pwd
/home/xieerqi/TESTDIR
$> bash /home/xieerqi/cleanup_directory.sh                                     
Archive:  /home/xieerqi/TESTDIR/Pictures.zip
  inflating: /home/xieerqi/TESTDIR/ASDF.png  
  inflating: /home/xieerqi/TESTDIR/IMG20160117233913~01.jpg  
  inflating: /home/xieerqi/TESTDIR/resized_Screenshot from 2016-01-10 08:52:10.png  
$> ls
JPEGS/  Pictures.zip  PNGS/
$> ls JPEGS
IMG20160117233913~01.jpg  rMzMHd7.jpg
$> ls PNGS/                                                                    
ASDF.png  resized_Screenshot from 2016-01-10 08:52:10.png  waves.png*
$> 

А вот и сам сценарий:

# Set here the working directory and the destinations
DIR="/home/xieerqi/TESTDIR"
PNG_DIR="/home/xieerqi/TESTDIR/PNGS"
JPEGS_DIR="/home/xieerqi/TESTDIR/JPEGS"

# Find all zip files in dir and extract them
# If not found, the script just continues on
find $DIR -maxdepth 1  -type f -iname "*.zip" -exec unzip {} -d $DIR \; 

# Find all png files in the dir and move them to PNG_DIR
# use cp instead of mv if you are worried about loosing files
find $DIR -maxdepth 1 -type f -iname "*.png" -exec mv -t $PNG_DIR {} \+

# Find all JPEG/JPG files and throw them into JPENGS_DIR
# use cp if you are worried about loosing files
find $DIR -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) -exec mv -t $JPEGS_DIR {} \+

Связанный контент