Перемещение нескольких файлов в подкаталогах (и / или разбиение строк по многоканальному разделителю) [bash]
В общем, у меня есть папка с кучей подпапок, в которой более 100 файлов. Я хочу взять все файлы mp3 (действительно общее расширение, так как мне придется делать это с jpg и т. Д.) И переместить их в новую папку в исходном каталоге. Итак, в основном структура файла выглядит следующим образом:
/.../dir/recup1/file1.mp3
/.../dir/recup2/file2.mp3
... так далее.
и я хочу, чтобы это выглядело так:
/.../dir/music/file1.mp3
/.../dir/music/file2.mp3
... так далее.
Я решил использовать bash-скрипт, который выглядит так:
#!/bin/bash
STR=`find ./ -type f -name \*.mp3`
FILES=(echo $STR | tr ".mp3 " "\n")
for x in $FILES
do
echo "> [$x]"
done
У меня просто пока есть эхо, но в конце концов я бы хотел использовать mv
чтобы получить его в нужную папку. Очевидно, что это не работает, потому что tr рассматривает каждый символ как разделитель, поэтому, если у вас, ребята, есть идея получше, я буду признателен.
(К вашему сведению, я использую нетбук Ubuntu, так что если есть GUI-интерфейс, похожий на поиск Windows, я не буду против его использования)
2 ответа
Если music
папка существует, тогда должно работать следующее:
find /path/to/search -type f -iname "*.mp3" -exec mv {} path/to/music \;
-exec command
должен быть завершен с ;
(так что вам обычно нужно набрать \;
или же ';'
чтобы избежать интерпретации оболочкой) или +
, Разница в том, что с ;
, команда вызывается один раз для файла, с +
, он вызывается как можно меньше раз (обычно один раз, но максимальная длина командной строки, поэтому она может быть разделена) со всеми именами файлов.
Вы можете сделать это так:
find /some/dir -type f -iname '*.mp3' -exec mv \{\} /where/to/move/ \;
\{\}
часть будет заменена найденным именем файла / путем. \;
часть устанавливает конец для -exec
часть, это не может быть пропущено.
Если вы хотите распечатать найденное, просто добавьте -print
пометить как:
find /some/dir -type f -iname '*.mp3' -print -exec mv \{\} /where/to/move/ \;
НТН