
Я могу достаточно легко перемещать файлы в терминале. У меня куча всего, что студенты присылают ежедневно, и мне было бы намного проще иметь одну вещь, которую я мог бы запустить вечером и которая перемещала бы все отправленные фотографии (обычно 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 {} \+