Classificando a saída de "find"?


77

Eu preciso ser capaz de classificar alfabeticamente a saída findantes de canalizá-la para um comando. Entrar | sort |entre não funcionou, então o que eu poderia fazer?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

Respostas:


52

Use findcomo de costume e delimite suas linhas com NUL. O GNU sortpode lidar com isso com a opção -z:

find . -print0 | sort -z | xargs -r0 yourcommand

58

Algumas versões do sorttêm uma -zopção, que permite registros terminados em nulo.

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

Além disso, você também pode escrever um script de alto nível para fazer isso:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

Adicione a -ropção para xargscertificar-se de que myCommandé chamado com um argumento.


Bom (dois?) ... Curiosamente, porém, os dois métodos lidam de maneira .diferente ... Com sortisso termina no final da lista ... com pythonclassificação até o topo. (talvez os tipos de python com LC_COLLATE=C)
Peter.O

Há também a -t \0opção de tipo (que é um -zsinônimo)
Javier

1
O problema com todas essas |sortsoluções é que você não pode mais usar -exec. OK, embora seja possível reescrever sua declaração dada para -execque ela funcione xargs, a pergunta é: e quanto aos "mini-scripts" ? ( sh -c ...) Eu não chamaria isso trivial para transformar um mini-script 'sh -c' com vários comandos para que ele possa trabalhar com xargs(se possível em tudo, que é)
SyntaxError

@ syntaxerror: Qual problema você tem usando sh -c com xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

Eu acho que você precisa da -nbandeira para classificar #

De acordo com o tipo de homem:

-n, --numeric-sort
    compare according to string numerical value

editar

O print0 pode ter algo a ver com isso, acabei de testar isso. Retire o print0, você pode cancelar a sequência em ordem usando o -zsinalizador


Bem, isso print0parece ser espaço-separando os nomes de arquivos que é o que eu preciso passar para o meu comando, infelizmente
industrial

1

Se você possui o GNU Parallel http://www.gnu.org/software/parallel/ instalado, você pode fazer isso:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

Você pode instalar o GNU Parallel simplesmente:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Assista aos vídeos de introdução do GNU Parallel para saber mais: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Qual é a justificativa para usar o GNU Parallel? Para acelerar?
Peter Mortensen

Isso e você não precisa mexer com \ 0 registros separados.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.