
Tenho uma grande quantidade de e-books que estão muito desorganizados. Alguns deles estão sozinhos em seus próprios diretórios, alguns deles estão corrompidos, alguns diretórios estão vazios. Como faço para reunir meus e-books de todos esses diretórios diferentes e colocá-los todos em uma pasta para poder lê-los e reorganizá-los? Eu prefiro usar comandos GNU nativos ou um script bash.
Responder1
Presumo que você tenha pelo menos todos eles em vários subdiretórios em uma única pasta pai. Algo como ~/mybooks
. Se sim, você pode fazer isso:
find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Isso encontrará todos os arquivos ou diretórios cujo nome termina em .pdf
ou .epub
no diretório ~/mybooks
e os moverá para o diretório ~/newdir
. Se você puder ter diretórios cujo nome termine em .pdf
ou .epub
, adicione a -type f
diretiva para obter apenas arquivos:
find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
Responder2
Para mover todos os arquivos com certas 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 destination
diretório já deve existir. Você pode omitir a source/
parte se quiser coletar arquivos no diretório atual e seus subdiretórios. Se você deseja mover todos os arquivos independentemente do nome, mas não os diretórios:
mv -i source/**/*(.) destination/
Na festa:
shopt -s extglob globstar
mv -i source/**/*.@(pdf|epub) destination/
Esses 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 globbing recursivo.
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órios existente contiver alguma informação, então, em vez de mover os arquivos, você poderá achar mais conveniente criarlinks físicosoulinks 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 estarão em pé de igualdade. Você pode saber que um arquivo possui links físicos porque o número na segunda coluna na saída de ls -l
é maior que 1.
Para fazer links simbólicos, primeiro mude para o diretório de destino e chame ln -s
usando .
(representando o diretório atual) como destino. Um link simbólico é um arquivo que diz apenas “olhe esse arquivo ali”. 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 (ou seja, 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