Как мне написать сценарий для циклического просмотра каждой папки на жестком диске, поиска любых видеофайлов, извлечения их в корневой каталог жесткого диска и удаления всего остального?
1 ответ
Как правило, если вам нужно "зациклить" набор файлов в Linux, вы не хотите писать реальный цикл Bash (например, с for
), но вместо этого используйте find
. Следующее должно работать для всех версий find
, а дистрибутивы Linux поставляются с GNU find
, чье руководство вы обязательно должны прочитать в какой-то момент.
Будьте осторожны со следующими командами. Если вы не знаете, что делаете, или сначала не проверяете результаты, вы можете безвозвратно потерять данные.
find /mount/drive -type f \( -iname "*.mp4" -o -iname "*.avi" \) \ -exec echo mv '{}' /mount/drive/ \;
Это напечатало бы список команд mv
. Как только вы убедитесь, что он делает то, что вы хотите, удалите echo
из команды и выполните его снова.
Замечания:
-type f
ограничит результаты только файлами.find
перезапишет файлы с тем же именем без предупреждения. Чтобы избежать коллизий, используйтеmv -i
, который подскажет вам в таком случае.- Вы можете добавить к этому дополнительные условия для поиска файлов других типов, например,
-o -iname "*.mov"
и так далее.
На втором шаге мы удалим все, что не находится в корне диска. Для этого нам понадобятся две команды, так как вы сначала хотите удалить все файлы ...
find /mount/drive -mindepth 2 -type f
Если вы уверены, что в этом списке есть все, что вы хотите удалить, добавьте -delete
к команде. Здесь mindepth 2
гарантирует, что ваш root (со всеми видео в нем) останется нетронутым.
Затем найдите оставшиеся пустые папки:
find /mount/drive -mindepth 1 -depth -type d -empty
Как и выше, добавьте -delete
к этой команде, чтобы фактически удалить пустые каталоги.