Перемещение нескольких файлов в подкаталогах (и / или разбиение строк по многоканальному разделителю) [bash] - PullRequest
2 голосов
/ 03 января 2012

Итак, у меня есть папка с кучей подпапок, в которой более 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 рассматривает каждый символ как разделитель, поэтому, если у вас, ребята, есть идея получше, я буду признателен за это.Графический интерфейс похож на поиск Windows, я бы не стал его использовать)

Ответы [ 2 ]

1 голос
/ 03 января 2012

Если папка music существует, то должно работать следующее -

find /path/to/search -type f -iname "*.mp3" -exec mv {} path/to/music \;

A -exec command должно заканчиваться на ; (поэтому обычно вам нужно набрать \; или ';' чтобы избежать интерпретации оболочкой) или +.Разница в том, что при ; команда вызывается один раз для файла, при + она вызывается как можно меньше раз (обычно один раз, но максимальная длина для командной строки, поэтому она может бытьразделить) со всеми именами файлов.

0 голосов
/ 03 января 2012

Вы можете сделать это следующим образом:

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/ \;

HTH

...