“Bul” un çıktısını sıralama?


77

findKomuta göndermeden önce çıktılarını alfabetik olarak sıralayabilmeliyim . Araya girme | sort |işe yaramadı, ne yapabilirdim?

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

Yanıtlar:


52

findHer zamanki gibi kullanın ve satırlarınızı NUL ile sınırlandırın. GNU sort, -z anahtarıyla bunları kullanabilir:

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

58

Bazı sürümlerde boş sonlandırılmış kayıtlara izin veren sortbir -zseçenek vardır.

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

Ayrıca, bunu yapmak için üst düzey bir komut dosyası da yazabilirsiniz:

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

Argümanla çağrıldığından emin olmak için -rseçeneği ekleyin .xargsmyCommand


İyi bir (iki?) ... İlginçtir, yine de, iki yöntem .farklı sortişler ... Listenin sonunda pythonsolar ... onunla en üste çıkar. (belki python sıralar LC_COLLATE=C)
Peter.O

Ayrıca -t \0sıralama seçeneği de vardır ( -zeşanlamlı olan)
Javier

1
Tüm bu |sortçözümlerle ilgili sorun, -execartık kullanamamanızdır . Tamam, sizin ifadeniz verilen yeniden yazmak mümkün olsa -execda çalışır, böylece xargssöz vardır, neyi "mini komut" hakkında ? ( sh -c ...) Ben bir 'sh -c' mini senaryoyu dönüştürmek için bu önemsiz demezdim birden o ile çalışmak, böylece komutları xargs(yani eğer mümkünse)
SyntaxError

@syntaxerror: sh -c ile xargs kullanmakta ne probleminiz var? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Roger Pate,

4

Bence -nsıralama için bayrağa ihtiyacın var.

Adama göre:

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

Düzenle

Print0'in bununla bir ilgisi olabilir, sadece bunu test ettim. Print0 çıkarıp, kullandığınız çeşit dize sonlandırmak can null -zbayrağı


Peki, bu print0benim emrime geçmek için ihtiyacım olan dosya adlarını boşlukla ayırıyor gibi görünüyor, ne yazık ki
Industrial

1

Eğer GNU Parallel http://www.gnu.org/software/parallel/ kurulu ise bunu yapabilirsiniz:

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

GNU Parallel'ı basitçe aşağıdaki şekilde kurabilirsiniz:

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

Daha fazla bilgi için GNU Parallel için tanıtım videolarını izleyin: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


GNU Parallel kullanmanın gerekçesi nedir? Hızlandırmak için mi?
Peter Mortensen

Bu ve \ 0 ayrılmış kayıtlarla uğraşmanıza gerek yok.
Ole Tange
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.