Uma versão fácil que sempre cria subdiretórios flac
e mp3
(a menos que eles estivessem vazios), usando o comando find
para executar um script para criar um subdiretório se necessário e mover o arquivo para lá:
find . -name '*.mp3' -o -name '*.flac' -exec sh -c 'mkdir -p "${0%/*}/${0##*.}" && mv "$0" "${0%/*}/${0##*.}"' {} \;
Para cada arquivo para o qual o fragmento de shell é executado, $0
é o caminho para o arquivo, ${0%/*}
é a parte do diretório e ${0##*.}
é a extensão.
Como alternativa, no bash (ou ksh93 com set -o globstar
em vez de shopt -s globstar extglob
, ou em zsh sem setopt ksh_glob
), usando o **
pattern :
shopt -s globstar extglob
for x in **/*.@(mp3|flac); do
mkdir -p "${x%/*}/${x##*.}" && mv "$x" "${x%/*}/${x##*.}"
done
Agora vamos criar uma versão que não crie um subdiretório se todos os arquivos tiverem a mesma extensão. Aqui é mais fácil recorrer aos diretórios. Isto é para o bash (pode ser adaptado para ksh93 ou zsh). Em cada diretório, o script coleta a lista de todos os arquivos (excluindo o subdiretório .
e ..), all
.flac files and all
.mp3 files in arrays. If there is at least one flac file and at least one non-flac files, move the flac files to a
flac '. Idem para arquivos mp3.
shopt -s globstar nullglob; GLOBIGNORE=.:..
start_wd=$PWD
for dir in "$PWD"/**/*/; do
cd "$dir"
files=(*)
flac_files=(*.flac)
mp3_files=(*.mp3)
if ((${#flac_files[@]} > 0 && ${#flac_files[@]} < ${#files[@]})); then
mkdir flac && mv "${flac_files[@]}" flac/
fi
if ((${#mp3_files[@]} > 0 && ${#mp3_files[@]} < ${#files[@]})); then
mkdir mp3 && mv "${mp3_files[@]}" mp3/
fi
done
cd "$start_wd"