Mengapa ada perbedaan dalam output antara menggunakan
find . -exec ls '{}' \+
dan
find . -exec ls '{}' \;
Saya mendapatkan:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
terkait dengan-exec
selalu lolos, tetapi+
terkait dengan-mtime
tidak. Apakah Anda tahu alasannya? Saya kira itu adalah kebiasaan untuk tidak;
berhubungan dengan-exec
.;
. Tidak dapat membayangkan perlunya melarikan diri+
Semua jawaban sejauh ini benar. Saya menawarkan ini sebagai demonstrasi yang lebih jelas (kepada saya) dari perilaku yang digambarkan menggunakan
echo
daripadals
:Dengan titik koma, perintah
echo
ini disebut sekali per file (atau objek sistem file lain) yang ditemukan:Dengan nilai tambah, perintah
echo
ini dipanggil sekali saja. Setiap file yang ditemukan diteruskan sebagai argumen.Jika
find
menghasilkan sejumlah besar hasil, Anda mungkin menemukan bahwa perintah yang dipanggil tersedak pada sejumlah argumen.sumber
xargs
dilakukan ... pada prinsipnya tidak pernah tersedak karena terlalu banyak argumen.find
(danxargs
) di Solaris memancarkan lebih banyak argumen daripada yang bisa dikonsumsi. Tandaxargs
(danfind
) dalam findutils GNU tampaknya berperilaku lebih masuk akal, tetapi tidak semua orang menggunakan GNU.find
akan mencoba untuk menghindari mencapai batas jumlah argumen. Dan itu termasuk Solaris (setidaknya 10). Di mana itu mungkin gagal adalah jika Anda melakukan sesuatu sepertifind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
ataufind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, tetapifind
tidak dapat benar-benar disalahkan untuk itu. Perhatikan bahwa GNUfind
adalah salah satufind
implementasi terakhir yang didukung+
(dulu merupakan skrip port ke sistem GNU yang menyakitkan).Dari
man find
:perintah -exec;
perintah -exec {} +
Jadi, seperti yang saya pahami,
\;
menjalankan perintah terpisah untuk setiap file yang ditemukan olehfind
, sedangkan\+
menambahkan file dan mengeksekusi satu perintah pada mereka semua. Ini\
adalah karakter pelarian, jadi:vs.
Melakukan hal di atas di shell saya mencerminkan output dalam pertanyaan Anda.
contoh kapan Anda ingin menggunakannya
\+
Misalkan dua file,
1.tmp
dan2.tmp
:1.tmp:
2.tmp:
Dengan
\;
:Sedangkan jika Anda menggunakan
\+
(untuk menggabungkan hasilfind
):Jadi dalam hal ini bedanya
diff 1.tmp; diff 2.tmp
dandiff 1.tmp 2.tmp
Ada kasus di mana
\;
sesuai dan\+
akan diperlukan. Menggunakan\+
denganrm
adalah salah satu contohnya, di mana jika Anda menghapus sejumlah besar kinerja file (kecepatan) akan lebih unggul\;
.sumber
find
memiliki sintaks khusus. Anda menggunakan{}
apa adanya karena mereka memiliki makna untuk menemukan sebagai pathname dari file yang ditemukan dan (kebanyakan) shell tidak menafsirkannya sebaliknya. Anda perlu garis miring terbalik\;
karena tanda koma memiliki makna pada shell, yang memakannya sebelumfind
bisa mendapatkannya. Jadi apa yangfind
ingin dilihat SETELAH shell selesai, dalam daftar argumen yang diteruskan ke program C, adalahtetapi Anda perlu
\;
pada baris perintah untuk mendapatkan titik koma melalui shell ke argumen.Anda dapat lolos
\{\}
karena interpretasi shell-dikutip\{\}
adalah adil{}
. Demikian pula, Anda dapat menggunakan '{}'.Apa yang tidak bisa Anda lakukan adalah menggunakan
karena shell mengartikan itu sebagai satu argumen,
dan
rm {} ;
bukan nama perintah. (Setidaknya kecuali seseorang benar-benar main-main.)Memperbarui
perbedaannya adalah antara
dan
The
+
catenating nama ke baris perintah.sumber
Perbedaan antara
;
(titik koma) atau+
(tanda tambah) adalah bagaimana argumen diteruskan ke find's-exec
/-execdir
parameter. Sebagai contoh:menggunakan
;
akan menjalankan banyak perintah (secara terpisah untuk setiap argumen),Contoh:
menggunakan
+
akan mengeksekusi perintah sekecil mungkin (karena argumen digabungkan bersama). Ini sangat mirip dengan caraxargs
kerja perintah, sehingga akan menggunakan argumen sebanyak mungkin per perintah untuk menghindari melebihi batas maksimum argumen per baris.Contoh:
Lihat juga:
man find
sumber
kami mencoba mencari file untuk tata graha.
Temukan . -exec echo {} \; perintah dijalankan pada malam hari pada akhirnya tidak ada hasil.
Temukan . -exec echo {} \ + memiliki hasil dan hanya memakan waktu beberapa jam.
Semoga ini membantu.
sumber