Sortujesz wynik „znaleźć”?


77

Muszę być w stanie posortować alfabetycznie wynik findprzed przesłaniem go do polecenia. Wchodzenie | sort |pomiędzy nie działało, więc co mogłem zrobić?

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

Odpowiedzi:


52

Używaj findjak zwykle i ogranicz swoje linie za pomocą NUL. GNU sortmoże obsłużyć je za pomocą przełącznika -z:

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

58

Niektóre wersje sortmają -zopcję, która pozwala na rekordy zakończone zerem.

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

Dodatkowo możesz również napisać skrypt wysokiego poziomu, aby to zrobić:

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

Dodaj -ropcję, aby xargsupewnić się, że myCommandjest wywoływana z argumentem.


Dobry (dwa?) ... Co ciekawe, obie metody radzą sobie .inaczej ... Z sorttym kończy się na końcu listy ... z pythontym kończy się na górze. (może python sortuje z LC_COLLATE=C)
Peter.O

Istnieje również -t \0opcja sortowania (która jest -zsynonimem)
Javier,

1
Problem z tymi wszystkimi |sortrozwiązaniami polega na tym, że nie można już używać -exec. OK, chociaż możliwe jest, aby przepisać oświadczenie uwagę na -execto, że działa z xargs, pytanie brzmi, co o „mini-skryptów” ? ( sh -c ...) Nie nazwałbym tego tak trywialnym przekształceniem mini-skryptu „sh-c” z wieloma poleceniami, aby mógł on pracować z xargs(jeśli to w ogóle możliwe)
syntaxerror

@syntaxerror: Jaki masz problem z użyciem sh -c z xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate

4

Myślę, że potrzebujesz -nflagi do sortowania #

Według rodzaju człowieka:

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

edytować

Print0 może mieć z tym coś wspólnego, właśnie to przetestowałem. Wyjmij print0, możesz zerować sortowanie łańcucha za pomocą -zflagi


Cóż, print0wydaje się , że to oddzielające przestrzeń nazwy plików, które muszę przekazać mojemu niestety
Industrial

1

Jeśli masz zainstalowany GNU Parallel http://www.gnu.org/software/parallel/, możesz to zrobić:

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

Możesz zainstalować GNU Parallel po prostu przez:

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

Obejrzyj wideo wprowadzające do GNU Parallel, aby dowiedzieć się więcej: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Jakie jest uzasadnienie używania GNU Parallel? Aby przyspieszyć?
Peter Mortensen

I nie musisz zadzierać z \ 0 oddzielnymi rekordami.
Ole Tange,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.