Pertama, pahami bahwa pipa "|" menghubungkan perintah menyalurkan output dari yang pertama ke yang kedua sebagai argumen. Kedua kode shell Anda sama-sama menyalurkan output dari perintah find ke perintah lain (grep dan xargs). Mari kita lihat perintah tersebut satu demi satu:
Perintah pertama:temukan
find adalah program untuk "mencari file dalam hierarki direktori" (itulah penjelasan dari halaman manual find). Sintaksnya adalah (dalam hal ini)
find <search directory> <search pattern> <action>
Dalam kedua kasus, direktori pencarian adalah . (itu adalah direktori saat ini). Perhatikan bahwa itu tidak hanya mencari direktori saat ini tetapi juga semua subdirektorinya (hierarki direktori).
Pola pencarian menerima opsi -nama (artinya mencari file yang namanya cocok dengan pola yang diberikan sebagai argumen untuk opsi ini) atau -iname (sama dengan nama tetapi tidak peka huruf besar/kecil) antara lain.
Pola tindakan mungkin -print0 (cetak nama file yang tepat termasuk posisinya di direktori pencarian yang diberikan, yaitu jalur relatif atau absolut ke file) atau -exec (jalankan perintah yang diberikan pada file), perintahnya adalah untuk diakhiri dengan ";" dan setiap instance dari "{}" diganti dengan nama file).
Yaitu, kode shell pertama (bagian pertama, kiri pipa)
find . -iname \*.jpg -print0
mencari semua file dengan akhiran ".jpg" dalam hierarki direktori saat ini dan mencetak jalur dan namanya. Yang kedua (bagian pertama)
find . -name '*' -exec file {} \;
temukan semua file dalam hierarki direktori saat ini dan jalankan
file <filename>
pada mereka. File adalah perintah lain yang menentukan dan mencetak jenis file (lihat halaman manual untuk detailnya, file man).
Perintah kedua:xargs
xargs adalah perintah yang "membangun dan menjalankan baris perintah dari input standar" (man xargs), yaitu dari find output yang disalurkan ke xargs. Perintah yang dibuat dan dijalankannya adalah dalam hal ini
cp -v {} /home/joachim/neu2"
Opsi -I{} mendefinisikan string pengganti, yaitu setiap instance {} dalam perintah harus diganti dengan input yang didapatnya dari file (yaitu, nama file). Opsi -0 mendefinisikan bahwa item input tidak diakhiri (dipisahkan) dengan spasi putih atau baris baru tetapi hanya dengan karakter nol. Ini tampaknya diperlukan saat menggunakan dan cara standar untuk menangani keluaran find sebagai masukan xargs.
Perintah yang dibuat dan dijalankan tentu saja adalah perintah salin dengan opsi -v (verbose) dan menyalin setiap nama file yang didapat dari find ke direktori.
Perintah ketiga:grep
grep memfilter masukannya hanya dengan memberikan garis atau string yang cocok dengan pola keluaran tertentu. Opsi -o memberi tahu grep untuk mencetak hanya string yang cocok, bukan seluruh baris (lihat man grep), -P memberi tahu grep untuk menginterpretasikan pola berikut sebagai pola perl regexp. Dalam perl regex, ^ adalah awal baris, .+ adalah string arbitrer, arbitrer ini kemudian harus diikuti oleh titik dua, spasi, sejumlah karakter alfanumerik (dalam perl regex dilambangkan \w+) spasi dan string "gambar". Pada dasarnya perintah grep ini memfilter output file untuk hanya menampilkan nama file yang merupakan file gambar. (Baca tentang perl regex misalnya di sini:http://www.comp.leeds.ac.uk/Perl/matching.html )
Perintah yang sebenarnya Anda inginkan
Sekarang yang ingin Anda lakukan adalah (1) mengambil output dari perintah Shell kedua (yang mencantumkan file gambar), (2) membawanya ke bentuk yang sesuai dan (3) menyalurkannya ke perintah xargs dari perintah Shell pertama baris (yang kemudian membuat dan menjalankan perintah penyalinan yang Anda inginkan). Jadi kali ini kami memiliki perintah shell tiga (sebenarnya empat) tahap dengan dua pipa. Bukan masalah. Kita sudah memiliki tahapan (1) dan (3) (walaupun pada tahap (3) kita perlu mengabaikan opsi -0 karena input tidak lagi menemukan output; kita membutuhkannya untuk memperlakukan baris baru sebagai pemisah item).
Tahap (2) masih hilang. Saya sarankan menggunakan perintah cut untuk ini. cut mengubah string py memisahkannya menjadi bidang yang berbeda (dipisahkan oleh karakter pembatas dalam string asli) yang kemudian dapat diatur ulang. Saya akan memilih ":" sebagai karakter pembatas (ini mengakhiri nama file di keluaran grep, opsi -d':') dan memintanya untuk memberi kami bidang pertama saja (opsi -f1, essentialls:cetak hanya nama file, bukan bagian yang muncul setelah ":"), yaitu tahap (2) akan menjadi
cut -d':' -f1
Dan seluruh perintah yang Anda inginkan akan menjadi:
find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2
Perhatikan bahwa Anda dapat menemukan semua halaman manual misalnya di sini:http://www.linuxmanpages.com