Pode ser usado um pipe ao invés de exec em - find / -name “.txt” -exec cp {} / junk \; [duplicado]

1

Se eu quiser encontrar algum arquivo com .txt no nome e para cada correspondência encontrada copiá-lo para a pasta /junk , entendo que posso usar o seguinte:

find / -name ".txt" -exec cp {} /junk \;

Um pipe pode ser usado em vez de -exec no comando acima?

Acho que me lembro de alguém dizendo que um cano vai correr de cada lado (do cano) ao mesmo tempo em que -exec vai correr pelo lado esquerdo e depois pelo lado direito? Eu sinto falta de lembrar disso? O Pipe obviamente precisa obter a saída do comando esquerdo antes de fornecer a saída para o comando correto, por isso não vejo como eles podem ser executados ao mesmo tempo.

    
por microscope 31.01.2017 / 20:46

2 respostas

3

Você pode usar cpio no modo de cópia de cópia para isso.

find sourcedir -name "*.txt" | cpio -pd /junk

cpio recebe uma lista de arquivos da entrada padrão e, no modo copiar-passar, copia os arquivos para o diretório de destino.

    
por 31.01.2017 / 20:53
1

Você também pode encontrar o pipe no comando xargs

Os snippets nus de - link

Encontre todos os arquivos .mp3 na pasta de músicas e passe para o comando ls, -print0 será necessário se algum nome de arquivo contiver espaços em branco.:

   find ./music -name "*.mp3" -print0 | xargs -0 ls

Encontre todos os arquivos na pasta de trabalho, passe para o grep e procure por lucro:

   find ./work -print | xargs grep "profit"

Você precisa usar {} com vários comandos que levam mais de dois argumentos por vez. Por exemplo, o comando mv precisa saber o nome do arquivo. A seguir, você encontrará todos os arquivos .bak dentro ou abaixo do diretório atual e os moverá para o diretório ~ / .old.files:

find . -name "*.sh" -print0 | xargs -0 -I {} mv {} ~/back.scripts

Você pode renomear {} para outra coisa. No exemplo a seguir, {} é renomeado como arquivo. Isso é mais legível se comparado ao exemplo anterior:

find . -name "*.sh" -print0 | xargs -0 -I file mv file ~/back.scripts

Onde,

-0 Se houver espaços em branco ou caracteres (incluindo novas linhas), muitos comandos não funcionarão. Esta opção aceita os nomes dos arquivos com espaço em branco.

-I Substitui ocorrências de replace-str nos argumentos iniciais com nomes lidos da entrada padrão. Além disso, espaços em branco sem aspas não terminam itens de entrada; em vez disso, o separador é o caractere de nova linha.

    
por 31.01.2017 / 21:01

Tags