Dengan GNU sort, dan sebuah shell di mana printfbuilt-in (semua yang seperti POSIX saat ini kecuali beberapa varian pdksh):
printf '%s\0' * | sort -u --files0-from=- > output
Sekarang, masalah dengan itu adalah karena dua komponen dari pipa itu dijalankan secara bersamaan dan independen, pada saat yang kiri memperluas *gumpalan, yang tepat mungkin telah membuat outputfile yang dapat menyebabkan masalah (mungkin tidak dengan di -usini) seperti halnya outputfile input dan output, jadi Anda mungkin ingin agar outputnya pergi ke direktori lain ( > ../outputmisalnya), atau pastikan glob tidak cocok dengan file output.
Cara lain untuk mengatasinya dalam contoh ini adalah dengan menuliskannya:
printf '%s\0' * | sort -u --files0-from=- -o output
Dengan begitu, ini sortterbuka outputuntuk menulis dan (dalam pengujian saya), itu tidak akan melakukannya sebelum menerima daftar lengkap file (begitu lama setelah gumpalan telah diperluas). Ini juga akan menghindari clobbering outputjika tidak ada file input yang dapat dibaca.
Cara lain untuk menulisnya dengan zshataubash
sort -u --files0-from=<(printf '%s\0' *) -o output
Itu menggunakan proses substitusi (di mana <(...)digantikan oleh path file yang merujuk ke ujung pipa membaca printfuntuk menulis). Fitur itu berasal ksh, tetapi kshbersikeras membuat perluasan <(...)argumen terpisah ke perintah sehingga Anda tidak dapat menggunakannya dengan --option=<(...)sintaks. Akan bekerja dengan sintaks ini:
sort -u --files0-from <(printf '%s\0' *) -o output
Perhatikan bahwa Anda akan melihat perbedaan dari pendekatan yang mengumpankan output catpada file dalam kasus di mana ada file yang tidak berakhir dengan karakter baris baru:
$ printf a > a
$ printf b > b
$ printf '%s\0' a b | sort -u --files0-from=-
a
b
$ printf '%s\0' a b | xargs -r0 cat | sort -u
ab
Perhatikan juga bahwa sortmengurutkan menggunakan algoritme collation di locale ( strcollate()), dan sort -umelaporkan salah satu dari setiap set baris yang mengurutkan yang sama dengan algoritma itu, bukan garis unik pada level byte. Jika Anda hanya peduli tentang garis yang unik pada tingkat byte dan tidak terlalu peduli tentang urutannya, Anda mungkin ingin memperbaiki lokal ke C di mana penyortiran didasarkan pada nilai byte ( memcmp(); yang mungkin akan mempercepat segalanya secara signifikan):
printf '%s\0' * | LC_ALL=C sort -u --files0-from=- -o output
sortmelakukannya secara otomatis untuk input file multipel .. tapi kemudiansort -u *akan gagalArgument list too longjuga saya kira