Solução de três etapas. cd
para um diretório onde os arquivos estão e, em seguida:
-
Isso moverá cada arquivo para o subdiretório correspondente:
find . -maxdepth 1 -type f -iname "* -*.epub" \ -exec bash -c ' mkdir "${1%% -*}" 2>/dev/null; mv -n -- "$1" "${1%% -*}"/ ' bash {} \;
"${1%% -*}"
é uma parte de"$1"
até o primeiro-
(espaço + menos). Esperamos que às vezes o subdiretório já exista;mkdir
irá falhar, tudo bem. -
Isso detectará subdiretórios com dois ou menos arquivos e moverá todo o seu conteúdo (de volta) para o diretório de trabalho atual:
find . -mindepth 1 -maxdepth 1 -type d \ -exec sh -c ' [ $(find "$1" -maxdepth 1 -type f -printf "\n" | wc -l) -le 2 ] ' sh {} \; \ -exec sh -c ' find "$1" -mindepth 1 -maxdepth 1 -exec mv -n -t ./ -- \{\} + ' sh {} \;
Altere o fragmento
-le 2
para ajustar o número. Você pode se perguntar por que eu digo afind
para imprimir novas linhas em vez de nomes de arquivos (comportamento padrão). Isso ocorre porquewc
é uma ferramenta de texto, possíveis novas linhas em nomes de arquivos quebrarão minha lógica. A impressão explícita de exatamente uma nova linha por arquivo corrige esse problema. -
Isso removerá os diretórios vazios:
find . -maxdepth 1 -type d -empty -delete
Ele deve funcionar mesmo sem
-empty
porque-delete
(comormdir
) excluirá um diretório apenas se estiver vazio. No entanto, nesse caso, gostaria de suprimir as mensagens de erro esperadas dizendo que o diretório fornecido não está vazio. Fazer isso com2>/dev/null
também me impediria de ver mensagens de erro inesperadas. Daí o-empty
de qualquer maneira.
Execute estes passo a passo ou crie um script. É aconselhável fazer backup de sua estrutura de diretórios com antecedência (por exemplo, cp -lr my_directory my_directory_backup
) apenas no caso. Algumas opções que usei não são POSIX, mas podem não funcionar para você. Além disso, se você já tiver subdiretórios, minha solução poderá gerenciá-los; ajuste-o às suas necessidades.