перемещение файлов определенных форматов из поддиректории в каталоги с одинаковыми именами папок

У меня странная ситуация. У меня есть 100 с папками с flac и mp3-копиями одних и тех же треков. Мне нужно отделить mp3-файлы от flacs и поместить их в аналогичные каталоги.

например:

Album A : flac+mp3 >> Album A : flac Album A : mp3 

Я нахожусь в системе Unix. Как я могу использовать командную строку для достижения этой цели?

Этот маленький скрипт сделает то, что вы хотите. Запустите его из каталога, содержащего вашу музыку (вы можете скопировать / вставить непосредственно в терминал и нажать Enter ):

 ## Find all subdirectories of the current directory and ## iterate through them, saving their name in the $d variable. ## There are various tricks used here to deal with spaces and ## weird characters in file names. See http://mywiki.wooledge.org/BashFAQ/020 find . -type d -print0 | while IFS= read -r -d '' dir; do ## Create the $dir/mp3 and $dir/flac directories ## unless they exist mkdir -p "$dir"/{mp3,flac} ## Move all mp4 files to $dir/mp3 mv "$dir"/*.mp3 "$dir"/mp3 2>/dev/null ## Move all flac files to $dir/flac mv "$dir"/*.flac "$dir"/flac 2>/dev/null ## The previous steps will also create an artist/mp3 and ## artist/flac directories, and if there were no files in ## the artist directory (only in the albums) these will be empty. ## This deletes them safely since rmdir will only remove empty ones. rmdir "$dir"/{flac,mp3} 2>/dev/null done 

Приведенная выше команда изменит это:

 ├── artist1 │  ├── album1 │  │  ├── file1.flac │  │  ├── file1.mp3 │  │  ├── file2.flac │  │  └── file2.mp3 │  └── album2 │  ├── file1.flac │  ├── file1.mp3 │  ├── file2.flac │  └── file2.mp3 └── artist2 ├── album1 │  ├── file1.flac │  ├── file1.mp3 │  ├── file2.flac │  └── file2.mp3 └── album2 ├── file1.flac ├── file1.mp3 ├── file2.flac └── file2.mp3 

к этому:

 ├── artist1 │  ├── album1 │  │  ├── flac │  │  │  ├── file1.flac │  │  │  └── file2.flac │  │  └── mp3 │  │  ├── file1.mp3 │  │  └── file2.mp3 │  └── album2 │  ├── flac │  │  ├── file1.flac │  │  └── file2.flac │  └── mp3 │  ├── file1.mp3 │  └── file2.mp3 └── artist2 ├── album1 │  ├── flac │  │  ├── file1.flac │  │  └── file2.flac │  └── mp3 │  ├── file1.mp3 │  └── file2.mp3 └── album2 ├── flac │  ├── file1.flac │  └── file2.flac └── mp3 ├── file1.mp3 └── file2.mp3 

Вы можете сделать это с помощью find , mkdir и mv . Сначала создайте необходимые каталоги:

 cd /target/dir/mp3 # the next line produces output which explains what's happening find /source/dir -mindepth 1 -type d -printf "%P\0" | xargs -0 echo mkdir find /source/dir -mindepth 1 -type d -printf "%P\0" | xargs -0 mkdir 

Каждый каталог под исходным корнем создается под целевым корнем. И опять же, для другой группы файлов:

 cd /target/dir/flac find /source/dir -mindepth 1 -type d -printf "%P\0" | xargs -0 mkdir 

Проверьте, делает ли это то, что вы хотите:

 find /source/dir -mindepth 1 -type d -printf "%P\0" | xargs -0 -n 1 bash -c \ 'cd /source/dir/"$1"; echo mv -t "/target/dir/mp3/$1" *.mp3' bash-mv 

Из-за echo это не опасно, но показывает, что произойдет (если echo будет удалено): для каждого каталога под корнем источника текущий каталог будет изменен на него, а mv вызывается для всех файлов соответствующего типа в этом каталоге. Сложная -printf | xargs bash -c -printf | xargs bash -c объясняется тем, что … Я раньше не понимал, что это возможно:

 cd /source/dir find . -mindepth 1 -type d -exec bash -c 'echo mv -t "/target/dir/mp3/{}" "{}"/*.mp3' \; 

Оболочка по-прежнему необходима для расширения *.mp3 .