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

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

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

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

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

2
задан 24 April 2016 в 23:23

2 ответа

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

Это не будет, только который "привела бы к сбою" единственная команда (значение *.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
2
ответ дан 25 April 2016 в 09:23
  • 1
    Спасибо; Я полагаю, что chkdsk займет много времени, некоторые разделы NTFS, включая C: находитесь на SSD, и я когда-то так или иначе потерял данные, работающие chldsk. Текущая ситуация - то, что, кроме Linux, не монтирующего портативный диск, я могу читать и записать в C: и все другие разделы NTFS и в Windows и в Linux за исключением того, что очень малочисленное меньшинство неважных файлов недоступно или Windows или Linux. Поэтому ввиду рисков и включенное время, действительно необходимо выполнить chkdsk на совершенно здоровых разделах? – WGCman 13 September 2017 в 09:46

Достаточно иметь 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 {} \+
0
ответ дан 25 April 2016 в 09:23
  • 1
    @WGCman проиграл, данные из-за chkdsk очень очень необычны, и только произошли бы, если диск/раздел был действительно действительно испорчен... и кто знает, что условие файлов так или иначе. Если диск/раздел рассматриваемое монтирование только в r/o режиме и you' ре хорошо с этим, затем пропустите chkdsk. При необходимости в диске/разделе быть r/w скопируйте данные, то выполненный chkdsk, и по крайней мере you' ll имеют восстановление, если данные действительно теряются. Но в целом, I' d говорят, что риск является очень очень низким. Можно все еще сделать другие команды в моем ответе так или иначе. – heynnema 13 September 2017 в 09:51

Другие вопросы по тегам:

Похожие вопросы: