Перемещение файлов в каталоги на основе расширения
Я новичок в 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: не каталог
Я сделал что-то неправильно? Камаль