Перемещение файлов в каталоги на основе расширения

Я новичок в Linux. Я пытаюсь написать сценарий оболочки, который будет переместить файлы в определенные папки на основе их расширения, например в папке "Мои загрузки", у меня есть все файлы, смешанных типов файлов. Я написал следующий скрипт

mv *.mp3 ../Music
mv *.ogg ../Music
mv *.wav ../Music
mv *.mp4 ../Videos
mv *.flv ../Videos

как я могу заставить его запускаться автоматически при добавлении файла в эту папку? Теперь я должен вручную запускать сценарий каждый раз.

еще один вопрос, есть ли способ объединить эти 2 заявления

mv *.mp3 ../../Music
mv *.ogg ../../Music

в одном заявлении? Я пробовал использовать || (оператор программирования C 'или') и запятая, но они, похоже, не работают.

4 ответов


нет триггера для добавления файла в каталог. Если файл загружен через веб-страницу, вы можете сделать это на веб-странице.

для этого вы можете поместить скрипт в crontab на машинах unix (или Task schedular в windows). Google crontab для руководства.

что касается объединения команд, используйте следующее:

mv *.mp3 *.ogg ../../Music

вы можете включить столько разных "глобусов" (имена файлов с подстановочными знаками), сколько хотите. Последнее, что должно быть целевой каталог.


два варианта:

  1. find . -name '*mp3' -or -name '*ogg' -print | xargs -J% mv % ../../Music
  2. find . -name '*mp3' -or -name '*ogg' -exec mv {} ../Music \;

первый использует канал и может исчерпать пространство аргументов; в то время как второй может использовать слишком много вилок и быть медленнее. Но, оба будут работать.


incron будет наблюдать за файловой системой и выполнять команды запуска при определенных событиях.

можно объединить несколько команд в одну строку с помощью разделителя команд. Безусловный сериализованный разделитель команд -;.

command1 ; command2

другой способ:

mv -v {*.mp3,*.ogg,*.wav} ../Music
mv -v {*.mp4,*.flv} ../Videos

PS: опция-v показывает, что происходит (подробно).