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;mkdirirá 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 2para ajustar o número. Você pode se perguntar por que eu digo afindpara 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 -deleteEle deve funcionar mesmo sem
-emptyporque-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/nulltambém me impediria de ver mensagens de erro inesperadas. Daí o-emptyde 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.