Para mover todos os arquivos com determinadas extensões em uma árvore de diretórios (ou seja, em um diretório e seus subdiretórios recursivamente) para um único diretório, em zsh:
mv -i source/**/*.(pdf|epub) destination/
O diretório destination
já deve existir. Você pode omitir a parte source/
se quiser coletar arquivos no diretório atual e em seus subdiretórios. Se você quiser mover todos os arquivos, independentemente do nome, mas não dos diretórios:
mv -i source/**/*(.) destination/
No bash:
shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/
Estes comandos podem reclamar que a linha de comando é muito longa se você tiver muitos arquivos. Nesse caso, você pode chamar find
em vez de usar globalização recursiva.
find source -name '*.pdf' -o -name '*.epub' -exec mv -i -t destination/ {} +
find source -type f -exec mv -i -t destination/ {} +
Se a estrutura de diretório existente tiver algumas informações, em vez de mover os arquivos, talvez seja mais conveniente criar links físicos ou links simbólicos .
Para criar links físicos, chame ln
em vez de mv -i
. Com links físicos, cada arquivo estará presente em ambos os lugares ao mesmo tempo. Se você remover o arquivo original ou o novo, o outro permanecerá: os dois locais do arquivo estão em pé de igualdade. Você pode dizer que um arquivo tem links físicos porque o número na segunda coluna na saída de ls -l
é maior que 1.
Para criar links simbólicos, primeiro altere para o diretório de destino e chame ln -s
usando .
(representando o diretório atual) como o destino. Um link simbólico é um arquivo que diz apenas “olhe esse arquivo para lá”. Se você remover o link simbólico, isso não afetará o arquivo original. Se você mover ou remover o arquivo original, o link simbólico ficará pendente (isto é, ele ainda estará lá, mas não apontará mais para um arquivo).
Para remover diretórios vazios em um diretório, você pode usar
find /some/directory -depth -type d -empty -delete