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

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

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

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

Еще один вопрос: есть ли способ объединения этих двух утверждений

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

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

Ответ 1

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

Вы можете поместить script в crontab для этого, на Unix-машинах (или в расписании задач в окнах). Google crontab для практического использования.

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

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

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

Ответ 2

Два способа:

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

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

Ответ 3

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

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

command1 ; command2

Ответ 4

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

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

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

Ответ 5

Мне нравится этот метод:

#!/bin/bash                                                                                                                                                                                                 

for filename in *; do
  if [[ -f "$filename" ]]; then
      base=${filename%.*}
      ext=${filename#$base.}
    mkdir -p "${ext}"
    mv "$filename" "${ext}"
  fi
done

Ответ 6

Я пытался переместить все ZIP файлы в папку в том же каталоге с помощью этой команды, как это было предложено:

находить. -name '*.zip' -exec mv "{}"../archive_data \;

однако там ничего не двигалось, и я потерял все zip файлы. также есть папка, созданная в каталоге верхнего уровня с тем же именем "archive_data", но когда я перехожу к этой папке, я получаю:

-bash: cd: archive_data: не каталог

Я сделал что-то неправильно? Камаль