Mengurutkan output dari "find"?

77

Saya harus bisa mengurutkan abjad output findsebelum mengirimnya ke perintah. Memasuki | sort |antara tidak berhasil, jadi apa yang bisa saya lakukan?

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

Jawaban:

52

Gunakan findseperti biasa dan batasi baris Anda dengan NUL. GNU sortdapat mengatasinya dengan tombol -z:

find . -print0 | sort -z | xargs -r0 yourcommand
Oli
sumber
58

Beberapa versi sortmemiliki -zopsi, yang memungkinkan untuk catatan yang diakhiri dengan nol.

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

Selain itu, Anda juga dapat menulis skrip tingkat tinggi untuk melakukannya:

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

Tambahkan -ropsi untuk xargsmemastikan bahwa myCommanditu dipanggil dengan argumen.

Arcege
sumber
Bagus satu (dua?) ... Menariknya, meskipun, dua metode menangani .berbeda ... Dengan sortitu berakhir di akhir daftar ... dengan pythonitu agak ke atas. (mungkin python macam dengan LC_COLLATE=C)
Peter.O
Ada juga -t \0opsi untuk sort (yang merupakan -zsinonim)
Javier
1
Masalah dengan semua |sortsolusi ini adalah Anda tidak dapat menggunakannya -execlagi. OK, meskipun dimungkinkan untuk menulis ulang pernyataan Anda -execagar dapat berfungsi xargs, pertanyaannya adalah, bagaimana dengan "skrip mini" ? ( sh -c ...) Saya tidak akan memanggil hal sepele itu untuk mengubah skrip mini 'sh -c' dengan beberapa perintah sehingga dapat bekerja dengan xargs(jika mungkin sama sekali, yaitu)
syntaxerror
@syntaxerror: Masalah apa yang Anda miliki menggunakan sh -c dengan xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate
4

Saya pikir Anda perlu -nbendera untuk mengurutkan #

Menurut jenis manusia:

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

sunting

Print0 mungkin ada hubungannya dengan ini, saya baru saja menguji ini. Keluarkan print0, Anda bisa null menghentikan string dengan menggunakan -zflag

siapa saya
sumber
Nah, yang print0tampaknya memisahkan ruang dari nama file yang saya butuhkan untuk menyampaikan perintah saya, sayangnya
Industrial
1

Jika Anda telah menginstal GNU Parallel http://www.gnu.org/software/parallel/ Anda dapat melakukan ini:

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

Anda dapat menginstal GNU Parallel hanya dengan:

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

Tonton video intro untuk GNU Parallel untuk mempelajari lebih lanjut: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Ole Tange
sumber
Apa justifikasi untuk menggunakan GNU Parallel? Untuk mempercepatnya?
Peter Mortensen
Itu dan Anda tidak perlu dipusingkan dengan \ 0 catatan yang dipisahkan.
Ole Tange