Colete arquivos de vários diretórios diferentes e coloque-os em um só lugar

Colete arquivos de vários diretórios diferentes e coloque-os em um só lugar

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 .pdfou .epubno diretório ~/mybookse os moverá para o diretório ~/newdir. Se você puder ter diretórios cujo nome termine em .pdfou .epub, adicione a -type fdiretiva 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 destinationdiretó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 findem 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 lnem 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 -susando .(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

informação relacionada