Copie arquivos .txt em um determinado diretório

2

Eu tenho um problema ao copiar meu arquivo em meus diretórios.

Eu tenho .txt e .jpeg arquivos em muitos diretórios e quero copiar apenas os arquivos .txt de acordo com o diretório. Por exemplo, eu tenho isso:

direct/direct1
direct/direct2

direct1:
 file.txt
 file2.txt
 file.jpeg
 file2.jpeg

direct2:
 file3.txt
 file4.txt
 file3.jpeg
 file4.jpeg

no meu comando copy eu preciso apenas dos arquivos .txt de cada diretório

    
por toto 22.05.2015 / 13:26

2 respostas

3

Se você deseja copiar todos os arquivos .txt em um diretório, use um padrão curinga :

cp direct/direct1/*.txt target

Isso copia todos os arquivos .txt que estão no diretório direct/direct1 para o diretório target (que já deve existir).

Você pode passar vários padrões para copiar arquivos de vários diretórios:

cp direct/direct1/*.txt direct/direct2/*.txt target

Se você deseja copiar os arquivos .txt de todos os subdiretórios de direct , também pode usar um curinga para o diretório:

cp direct/*/*.txt target

Se você deseja copiar somente de determinados diretórios, é possível usar um padrão curinga que corresponda apenas a esses diretórios. Por exemplo, se direct tiver quatro subdiretórios foo , bar , baz e qux e você só quiser copiar arquivos de bar e baz , poderá usar

cp direct/ba?/*.txt target

Nenhum dos exemplos até agora copiou arquivos de direct , ou de subsubdirectories de direct . Se você deseja copiar os arquivos .txt de direct , inclua-os na lista, por exemplo,

cp direct/*.txt direct/*/*.txt target

Se você deseja copiar arquivos de direct , todos os seus subdiretórios, todos os seus subdiretórios, e assim por diante de forma recursiva, você pode usar o curinga ** , se o seu shell suportar. Funciona fora da caixa em zsh, mas em bash , você precisa habilite-o primeiro com shopt -s globstar .

cp direct/**/*.txt target

Note que todos os arquivos são copiados em target , isto não reproduz a estrutura do diretório. Se você quiser reproduzir a estrutura de diretório, você precisa de uma ferramenta diferente, como rsync (tutorial ) ou pax .

rsync -am --include='*.txt' --include='*/' --exclude='*' direct/ target/
cd direct && pax -rw -pe -s'/\.txt$/&/' -s'/.*//' . target/
    
por 23.05.2015 / 01:24
2

Você pode usar find para selecionar apenas os arquivos '.txt de algum diretório:

find direct/direct? -name "*.txt"

isso imprimiria todos os arquivos, para que você possa verificar se conseguiu o que queria, e nem muito será selecionado. O *.txt tem que ser citado, caso contrário, o shell tentará expandir isso para .txt arquivos no diretório atual.

Quanto à cópia, você quer fazer (na maioria das vezes) uma das duas coisas: preservar o caminho diretamente no arquivo .txt ou não. Para preservar, use:

find direct/direct? -name "*.txt" -print0 | cpio -pdmv0 target_directory

para copiar todos os arquivos .txt em um diretório de destino, use algo semelhante ao sugerido por @lambert:

find direct/direct? -name "*.txt" -exec cp {} target_directory +

(usar + em vez de \; é mais eficiente, pois vários nomes de arquivos são passados para um único cp quando + é usado em vez de invocar um cp para cada arquivo único ao usar \; )

Para o segundo comando -print0 não é necessário para manipular caminhos com caracteres especiais, o nome do arquivo que substitui {} é separado corretamente pelo modo como cp é invocado.

    
por 22.05.2015 / 14:02