Я могу перемещать файлы в терминале достаточно легко. У меня есть целый бардак, который каждый день подают ученики, и мне было бы намного легче иметь одну вещь, которую я могу запустить вечером, когда все фотографии (JPG и PNG обычно) перемещаются в один каталог, и весь текстовый материал другому.
Я мог бы написать что-то базовое с помощью команд mv *.jpg
, но если там нет файлов такого типа, то я предполагаю, что весь сценарий потерпит неудачу, и все упражнение по экономии времени будет бессмысленно.
Чтобы добавить усложнение, пара моих старшеклассников отправляют в zip-файлах, так что я бы хотел, чтобы сценарий сначала извлек их.
Итак, TL; DR - извлекать архивы и перемещать файлы без остановки для ошибок, вызванных отсутствием определенного типа файлов.
Я предполагаю, что весь сценарий перестал бы работать
Это не будет, только который "привела бы к сбою" единственная команда (значение *.jpg
шаблон globbing будет расширен до литерала *.jpg
, который заставит команду бросить ошибку в случае, если файл назвал *.jpg
не существует), но сценарий будет продолжать выполняться несмотря на ошибку. Так в большинстве случаев это не беспокойство, однако если Вы хотите сделать вещи Правильный Way™, включить failglob
прежде, чем выполнить команды, содержащие globbing шаблоны:
shopt -s failglob
Из справочника Bash: расширение имени файла:
Если
failglob
опция оболочки установлена, и никакие соответствия не найдены, сообщение об ошибке печатается, и команда не выполняется.
Извлечь все .zip файлы в текущем рабочем каталоге к единственному каталогу:
unzip '*.zip' -d /path/to/target/directory
Заметьте это *.zip
включается в одинарные кавычки, так, чтобы unzip
может развернуть шаблон самостоятельно (команда перестала бы работать иначе).
Помещение всего toghether:
#/bin/bash
shopt -s failglob
mv *.jpg /path/to/target/directory
mv *.png /path/to/target/directory
unzip '*.zip' -d /path/to/target/directory
Достаточно иметь 3 команды то использование find SOURCE_FOLDER -type f -exec COMMAND {} \;
структура. Рев является сценарием, который комбинирует все 3. Каждая команда выйдет тихо, если никакие файлы не нашли - простой как это; это означает, есть ли у Вас png файлы, но не jpeg файлы, Вы все еще переместите png, где они должны быть без ошибок.
Вот маленькая демонстрация, где Вы видите, что у меня есть 2 файлов изображений и 1 zip-файл. Сценарий разархивировал архив и затем собирает весь png и jpegs и броски в соответствующие каталоги
$> 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 {} \+