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
Industrial
fonte

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
Oli
fonte
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.

Arcege
fonte
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

Quem sou eu
fonte
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

Ole Tange
fonte
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