Berikut ini harus bekerja di semua jalur.
Deklarasikan fungsi untuk dapat menggunakan head
dan tail
pada keluaran yang dipisahkan NUL:
nul_terminated() {
tr '\0\n' '\n\0' | "[email protected]" | tr '\0\n' '\n\0'
}
Kemudian Anda dapat menggunakannya untuk mendapatkan daftar jalur yang dipisahkan NUL dari pencarian Anda setelah melewati tail
:
find . -exec printf '%s\0' {} \; | nul_terminated tail -n 2
Anda kemudian dapat menyalurkannya ke xargs
dan tambahkan opsi Anda:
find . -iname "*FooBar*" -exec printf '%s\0' {} \; | nul_terminated tail -n 2 | xargs -I "{}" -0 cp "{}" "dest"
Penjelasan:
find
file di direktori saat ini (.
) dan di bawahnya dengan nama yang mengandungfoobar
(tidak peka huruf besar/kecil karenai
di-iname
);- untuk setiap file, jalankan (
-exec
) perintah untuk - cetak setiap jalur file (
{}
) diikuti dengan karakter NUL (\0
) satu per satu (\;
); - tukar baris baru dan karakter NUL (
tr '\0\n' '\n\0'
);" - dapatkan dua baris terakhir (yaitu, jalur;
tail -n 2
,"[email protected]"
); - tukar baris baru dan karakter NUL lagi untuk mendapatkan daftar nama file yang dipisahkan NUL (
tr '\0\n' '\n\0'
).
xargs
perintah sedikit lebih sulit untuk dijelaskan. Itu membangun sebanyak cp ... "dest"
perintah seperlunya agar sesuai dengan panjang maksimum perintah sistem operasi, menggantikan {}
token dalam perintah dengan nama file sebenarnya (-I "{}" ... "{}"
), menggunakan karakter NUL sebagai pemisah saat membaca parameter (-0
).
Anda dapat mencoba
cp $(find . -iname "*FooBar*" | tail -2 ) dest
find . -iname "*FooBar*"|tail -n2|xargs -i cp "{}" dest
Sayangnya ini tidak akan berfungsi dengan nama file yang mengandung spasi atau baris baru.