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

3

Eu tenho uma grande quantidade de e-books que são muito desorganizados. Alguns deles estão sozinhos em seus próprios diretórios, alguns deles estão corrompidos, alguns dos 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 que eu possa lê-los e reorganizá-los? Eu prefiro usar comandos GNU nativos ou um script bash.

    
por bugzeeolboy 07.01.2015 / 09:43

2 respostas

4

Suponho que você tenha pelo menos todos eles em vários subdiretórios em uma única pasta pai. Algo como ~/mybooks . Se assim for, você pode fazer isso:

find ~/mybooks -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +

Isso localizará todos os arquivos ou diretórios cujos nomes terminam em .pdf ou .epub no diretório ~/mybooks e mova-os para o diretório ~/newdir . Se você puder ter diretórios cujos nomes terminem em .pdf ou .epub , adicione a diretiva -type f para obter apenas arquivos:

find ~/mybooks -type f -name '*.pdf' -or -name '*.epub' -exec mv -t ~/newdir {} +
    
por 07.01.2015 / 15:45
0

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
    
por 08.01.2015 / 01:44