Terkadang saya melihat perintah berikut:
find . -name * -exec ls -a {} \;
Saya diminta untuk mengeksekusi ini.
Apa yang dimaksud di {} \;
sini?
command-line
find
kode kode
sumber
sumber
-name *
berlebihan.-name *
lebih buruk dari mubazir. Karena tanda*
kutip tidak dikutip, shell memperluasnya ke daftar nama file di folder saat ini, dengan ruang-ruang yang salah dirawat, mengarah ke hasil yang tidak terduga atau pesan kesalahan. Sebagai tambahan,find
memiliki banyak fungsi, salah satunya adalah membuat daftar file; ini menghindari penggunaan-exec
. Misalnya, Anda dapat menggunakanfind . -print
ataufind . -ls
. Akhirnya, ada dua cara untuk melarikan diri semi-colon: baik seperti yang Anda lakukan dengan garis miring terbalik,\;
atau dengan mengutip:';'
. Gunakan mana pun yang Anda merasa lebih nyaman.Jawaban:
Jika Anda menjalankan
find
denganexec
,{}
memperluas untuk nama file dari setiap file atau direktori yang ditemukan denganfind
(sehinggals
dalam contoh Anda mendapatkan setiap nama file berhasil ditemukan sebagai argumen - catatan bahwa panggilanls
atau apa pun perintah lain yang Anda tentukan sekali untuk setiap file ditemukan).Titik koma
;
mengakhiri perintah yang dijalankan olehexec
. Itu perlu melarikan diri dengan\
sehingga shell yang Anda jalankanfind
di dalam tidak memperlakukannya sebagai karakter khusus sendiri, tetapi meneruskannya kefind
.Lihat artikel ini untuk lebih jelasnya.
Juga,
find
berikan beberapa optimasi denganexec cmd {} +
- ketika dijalankan seperti itu,find
menambahkan file yang ditemukan ke akhir perintah daripada memanggilnya satu kali per file (sehingga perintah dijalankan hanya sekali, jika mungkin).Perbedaan perilaku (jika tidak efisiensi) mudah terlihat jika dijalankan dengan
ls
, misalnyaDengan asumsi Anda memiliki beberapa
jpg
file (dengan jalur yang cukup pendek ), hasilnya adalah satu baris per file dalam kasus pertama danls
perilaku standar menampilkan file dalam kolom untuk yang terakhir.sumber
\;
dengan+
.find . -name * | ls -a -
?find
. Juga, outputls
dalam hal ini tampaknya tidak bergantung pada input - tidak peduli apa yang saya gunakan sebagai filterfind
,ls
hanya menampilkan konten direktori yang berfungsi dan itu saja. Periksa misalnyafind ~ -iname '*.jpg' -exec ls -a {} \;
vsfind ~ -iname '*.jpg' | ls -a
.echo 'foo' | ls -a
.-
dalamls -a -
perintah Anda saat menguji apa yang dilakukan @ dr-h.Dari halaman manual untuk
find
perintah :Jadi, inilah penjelasannya:
{}
berarti "output darifind
". Seperti dalam, "apa pun yangfind
ditemukan".find
mengembalikan jalur file yang Anda cari, kan? Jadi{}
gantikan itu; itu adalah penampung untuk setiap file yang ditemukan olehfind
perintah (diambil dari sini ).Bagian
\;
ini pada dasarnya mengatakanfind
"oke, saya sudah selesai dengan perintah yang ingin saya jalankan".Contoh:
Katakanlah saya berada di direktori yang penuh dengan
.txt
file. Saya kemudian menjalankan:Bagian pertama
find . -name *.txt
,, mengembalikan daftar.txt
file. Bagian kedua,-exec cat {} \;
akan mengeksekusicat
perintah untuk setiap file ditemukan olehfind
, jadicat file1.txt
,cat file2.txt
, dan sebagainya.sumber
*.txt
harus dikutip sebagai'*.txt'
. Ini karena jika ada.txt
file di folder saat ini, shell akan memperluas ini dan Anda akan mendapatkan hasil yang salah atau pesan kesalahan.find -name '*.txt' -exec cat {} \;