Dengan GNU sort
, dan sebuah shell di mana printf
built-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 output
file yang dapat menyebabkan masalah (mungkin tidak dengan di -u
sini) seperti halnya output
file input dan output, jadi Anda mungkin ingin agar outputnya pergi ke direktori lain ( > ../output
misalnya), 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 sort
terbuka output
untuk 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 output
jika tidak ada file input yang dapat dibaca.
Cara lain untuk menulisnya dengan zsh
ataubash
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 printf
untuk menulis). Fitur itu berasal ksh
, tetapi ksh
bersikeras 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 cat
pada 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 sort
mengurutkan menggunakan algoritme collation di locale ( strcollate()
), dan sort -u
melaporkan 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
sort
melakukannya secara otomatis untuk input file multipel .. tapi kemudiansort -u *
akan gagalArgument list too long
juga saya kira