Eu estava tentando encontrar todos os arquivos de um determinado tipo espalhados em subdiretórios e, para meus propósitos, só precisava do nome do arquivo. Tentei remover o componente do caminho via basename
, mas não funcionou com xargs
:
$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.
Eu recebo a mesma coisa (exatamente o mesmo erro) com uma dessas variações:
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
Por outro lado, isso funciona como esperado:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Isso acontece no Cygwin e no Debian 5.0.3 atualizados. Meu diagnóstico é que, por algum motivo, o xargs está passando duas linhas de entrada para o nome da base, mas por quê? O que está acontecendo aqui?
fonte
xargs
é que ele cria uma lista de argumentos e alimenta cada um com o comando que vem depois? caso contrário, qual é a diferença entre isso efind . -name '*.deb' | basename
?-a
opção: "suporta múltiplos argumentos e trata cada um como um nome".xargs
convertestdin
em argumentos de comando. De certa forma, é o oposto deecho
, que converte seus argumentos emstdout
. A diferença entrefind ... | xargs -n1 basename
orfind ... | xargs basename -a
efind ... | basename
é que os dois primeiros trabalharão com implementaçõesbasename
desse ignorarstdin
.Tente o seguinte:
fonte
find
comando, então eu o uso apenas para encontrar e listar arquivos, e xargs para todo o resto.basename apenas aceita um único argumento. O uso
-exec
funciona corretamente porque cada um{}
é substituído pelo nome do arquivo atual que está sendo processado e o comando é executado uma vez por arquivo correspondente , em vez de tentar enviar todos os argumentos para o nome da base de uma só vez.fonte
xargs
pode ser forçado a apenas passar um argumento também ...find . -name '*.deb' -print | xargs -n1 basename
Isso funciona, no entanto, a resposta aceita está sendo usada de
find
maneira mais apropriada. Encontrei esta pergunta procurandoxargs basename
problemas, pois estou usando outro comando para obter uma lista dos locais dos arquivos. A-n1
bandeira paraxargs
foi a resposta final para mim.fonte