Você precisa encadear alguns comandos do Linux, mas um deles não aceita entrada canalizada? xargs
você pode pegar a saída de um comando e enviá-la para outro comando como parâmetros.
Todos os utilitários padrão do Linux têm três fluxos de dados associado a eles. Eles são o fluxo de entrada padrão (Stdin), fluxo de saída padrão (stdout) e o fluxo de erro padrão (stderr).
Esses fluxos funcionam com texto. Nós enviamos o ticket (Stdin) para um comando usando texto, e a solução (stdout) é escrito na janela do terminal como texto. Além disso, as mensagens de erro são gravadas na janela do terminal como texto (stderr).
Um dos grandes recursos do Linux e dos sistemas operacionais semelhantes ao Unix é a capacidade de canalizar a saída stdout de um comando para a entrada stdin de um segundo comando.. O primeiro comando não se importa se sua saída não vai para uma janela de terminal, e o segundo comando não se importa se sua entrada não vem de um teclado.
Mesmo que todos os comandos do Linux tenham os três fluxos padrão, nem todos aceitam a saída padrão de outro comando como entrada para seu stdin. Isso significa que você não pode canalizar informações para eles.
xargs
é um comando para construir pipelines de execução usando fluxos de dados padrão. Através do uso xargs
podemos fazer comandos como echo
, rm
, e mkdir
aceitar entrada padrão como argumentos.
O comando xargs
xargs
aceitará entrada encanada. Ele também pode aceitar a entrada de um arquivo. xargs
use essa entrada como parâmetros para os comandos com os quais dissemos para trabalhar. Se não contarmos xargs
trabalhar com um comando específico, será usado por padrão echo
.
Podemos usar isso para demonstrar como xargs
sempre exibirá uma única linha de saída, mesmo a partir de uma entrada de várias linhas.
Se usarmos o -1
(liste um arquivo por linha) com opção ls
, nós temos um coluna única de nomes de arquivo.
ls -1 ./*.sh
Isso lista os arquivos de script de shell no diretório atual.
Recebemos uma única coluna conforme o esperado. Se o canalizarmos xargs
o que nós ganhamos
ls -1 ./*.sh | xargs
A saída é gravada na janela do terminal, como um longo fluxo de texto.
É esta habilidade que xargs
insira parâmetros em outros comandos.
Usando xargs com banheiro
Podemos usar xargs
facilmente ter wc
conte o palavras, personagens e falas em vários arquivos.
ls * .page | xargs wc
Isto é o que acontece:
ls
listar arquivos * .página e passe a lista paraxargs
.xargs
passe os nomes dos arquivos parawc
.wc
trata nomes de arquivo como se você os tivesse recebido como parâmetros de linha de comando.
As estatísticas de cada arquivo são exibidas junto com um total geral.
Use xargs com confirmação
Podemos usar o -p
opção (interativo) para ter xargs
Peça-nos uma confirmação de que teremos todo o gosto em prosseguir.
Se passarmos uma sequência de nomes de arquivos para touch
, através de xargs
, touch
Vai crie os arquivos para nós.
eco 'um dois três' | xargs -p touch
O comando a ser executado é exibido e xargs
espere que respondamos escrevendo "y" ou "y", o “n” o “N”, e pressionando Enter.
Se você apenas pressionar Enter, é tratado como “n”. O comando só é executado se você digitar "y" ou "Y".
Pressione "y" e pressione Enter. Podemos usar ls
para verificar se os arquivos foram criados.
é um dois três
Use o xargs com alguns comandos
Podemos usar vários comandos com xargs
usando o -I
(argumentos iniciais) opção.
é tratado como “é tratado como”. Onde quer que o token para a string de substituição apareça na linha de comando, os valores que foram fornecidos para xargs
são inseridos.
Vamos usar o tree
comando para ver os subdiretórios do diretório atual. a -d
(diretório) opção causa tree
para ignorar arquivos e apenas relatar sobre diretórios.
árvore -d
é tratado como “imagens”.
Em um arquivo chamado "diretórios.txt", temos os nomes de alguns diretórios que afirmamos ter criado. Podemos analisar seu conteúdo usando cat
.
cat directory.txt
Usaremos isso como dados de entrada para xargs
. O comando que vamos fazer é este:
cat directory.txt | xargs -I % sh -c 'echo %; mkdir% '
Isso quebra assim:
- cat directorios.txt |: Isso insere o conteúdo do arquivo directrories.txt (todos os novos nomes de diretório) sobre
xargs
. - xargs -I%: é tratado como “é tratado como” é tratado como “%”.
- sh -c: Isso inicia uma nova subcamada. a
-c
(comando) diz ao shell para ler os comandos da linha de comando. - ‘Eco %; mkdir% ‘: é tratado como “%” é tratado como
xargs
. aecho
o comando irá imprimir o nome do diretório; amkdir
comando irá criar diretório.
Os diretórios são listados um por um.
Podemos usar tree
mais uma vez para verificar se os diretórios foram criados.
árvore -d
Copie arquivos para vários locais
Podemos usar xargs
para nos permitir copiar arquivos para vários locais com um único comando.
Vamos canalizar os nomes de dois diretórios para xargs
como parâmetros de entrada. Bem dito xargs
para passar apenas um desses parâmetros por vez para o comando com o qual você está trabalhando.
Nesta circunstância, o comando é cp
. Então, o efeito é chamar cp
duas vezes, cada vez com um dos dois diretórios como parâmetro de linha de comando. a xargs
parâmetro que permite que isso aconteça é o -n
(numero maximo) opção. Vamos definir isso como um.
Também estamos usando o -v
(detalhado) opção com cp
para relatar o que está acontecendo.
echo ~ / Backups / ~ / Documents / page-files / | xargs -n 1 cp -v ./*.page
Os arquivos são copiados para os dois diretórios, um diretório ao mesmo tempo. cp
relata cada ação de cópia de arquivo para que possamos ver como são realizadas.
Remover arquivos em diretórios aninhados
Se os nomes dos arquivos tiverem espaços e caracteres estranhos, como caracteres de nova linha, xargs
você não será capaz de interpretá-los corretamente. Podemos superar esse problema usando a opção -0 (terminador nulo). Isso diz xargs
para usar o caractere nulo como um delimitador final para nomes de arquivo.
Vamos usar find
neste exemplo. find
tem sua própria opção para lidar com espaços em branco e caracteres estranhos em nomes de arquivos. É o -print0
(nome completo, personagem nulo).
achar . -nome "*.png" -tipo f -print0 | xargs -0 rm -v -rf "{}"
Isso quebra assim:
- circunstâncias . -Nome “* .png”:
find
é tratado como “.” é tratado como “* .png” é tratado como (type -f
). - -print0: nomes terminarão com um caractere nulo e espaços e caracteres estranhos serão atendidos.
- xargs -0: xargs além disso, considerará que os nomes dos arquivos terminam em nulos, e espaços e caracteres estranhos não causarão problemas.
- rm -v -rf “{}”: rm será prolixo e relatará o que está acontecendo (
-v
). Será recursivo (-r) e pesquisará em subdiretórios aninhados, e deletaremos arquivos sem perguntar (-f
). o “{}” é tratado como.
Todos os subdiretórios são pesquisados e os arquivos que correspondem ao padrão de pesquisa são removidos.
Remover diretórios aninhados
Digamos que queremos excluir um conjunto de subdiretórios aninhados. tree
vai nos deixar vê-los.
árvore -d
achar . -nome "nível um" -tipo d printo | xargs -o rm -v -rf "{}"
Este comando usará find para pesquisar recursivamente no diretório atual. é tratado como “nível um”. Nomes de diretórios são passados xargs
para rm
.
As únicas mudanças significativas entre este comando e o comando anterior são, o termo de pesquisa é o nome do diretório principal e -type d
dados find
para pesquisar diretórios, sem arquivos.
O nome de cada diretório é impresso à medida que é excluído. Podemos consultar com tree
:
árvore -d
Todos os subdiretórios aninhados são removidos.
Apagar todos os arquivos, exceto um tipo de arquivo
Podemos usar find
, xargs
e rm
para excluir todos os arquivos, exceto um tipo que queremos manter. É um pouco contraditório, mas fornecemos o nome do tipo de arquivo que pretendemos Salve , não o nome daqueles que queremos deletar.
a -not
opção diz find
para retornar os nomes dos arquivos que não coincidir com o padrão de pesquisa. Estamos usando o -I
(argumentos iniciais) opção com xargs
mais uma vez. Desta vez, é tratado como “{}”. Isso se comportará exatamente da mesma forma que o token de string de substituição que geramos anteriormente, é tratado como “%”.
achar . -tipo f -não - nome "*.sh" -print0 | xargs -0 -eu {} rm -v {}
Podemos consultar com ls
. é tratado como “* .sh”.
ls -l
Crie um arquivo com o Xargs
Podemos usar find
para procurar arquivos e passá-los xargs
para tar
, para criar um arquivo.
Vamos pesquisar o diretório atual. é tratado como “* .página”, é tratado como “.página”.
achar ./ - nome "*.página" -tipo f -print0 | xargs -0 -tar -cvzf page_files.tar.gz
Os arquivos são listados conforme o esperado, conforme o arquivo é criado.
O mediador de dados
Às vezes você precisa de um pequeno andaime ao empilhar as coisas. xargs
preenche a lacuna entre comandos que podem enviar informações e comandos que não são projetados para recebê-las.
Ambos xargs
e find
tem um grande número de alternativas. Sugerimos que você consulte suas páginas de manual para obter mais informações..
setTimeout(função(){
!função(f,b,e,v,n,t,s)
{E se(f.fbq)Retorna;n = f.fbq = função(){n.callMethod?
n.callMethod.apply(n,argumentos):n.queue.push(argumentos)};
E se(!f._fbq)f._fbq = n;n.push = n;n.loaded =!0;n.version = ’2.0′;
n.queue =[];t = b.createElement(e);t.async =!0;
t.src = v;s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, documento,'roteiro',
‘Https://connect.facebook.net/en_US/fbevents.js ’);
fbq('iniciar', ‘335401813750447’);
fbq('acompanhar', ‘PageView’);
},3000);