Berikut adalah versi yang disederhanakan dengan penjelasan tambahan untuk pemula seperti saya yang mencoba mempelajari cara meletakkan lebih dari satu perintah dalam satu baris.
Jika Anda menuliskan masalah dalam langkah-langkah, akan terlihat seperti ini:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Untuk mencapai hal ini, kita dapat menggunakan tiga UNIX perintah: find
, file
, dan grep
.
find
akan memeriksa setiap file di direktori.
file
akan memberi kami jenis file. Dalam kasus kami, kami mencari pengembalian 'teks ASCII'
grep
akan mencari kata kunci 'ASCII' pada keluaran dari file
Jadi bagaimana kita bisa merangkai ini menjadi satu baris? Ada banyak cara untuk melakukannya, tetapi menurut saya melakukannya dalam urutan kode semu adalah yang paling masuk akal (terutama bagi pemula seperti saya).
find ./ -exec file {} ";" | grep 'ASCII'
Terlihat rumit, tapi lumayan saat kita memecahnya:
find ./
= lihat semua file di direktori ini. The find
perintah print nama file dari file yang cocok dengan 'ekspresi', atau apa pun yang datang setelah jalan, yang dalam hal ini adalah direktori saat ini atau./
Hal terpenting untuk dipahami adalah bahwa segala sesuatu setelah bit pertama itu akan dievaluasi sebagai Benar atau Salah. Jika Benar, nama file akan dicetak. Jika tidak, maka perintah akan terus berlanjut.
-exec
= Bendera ini adalah opsi di dalam perintah find yang memungkinkan kita menggunakan hasil dari beberapa perintah lain sebagai ekspresi pencarian. Ini seperti memanggil suatu fungsi dalam suatu fungsi.
file {}
= perintah dipanggil di dalam find
. The file
perintah mengembalikan sebuah string yang memberitahu Anda filetype file. Secara teratur, itu akan terlihat seperti ini: file mytextfile.txt
. Dalam kasus kami, kami ingin itu menggunakan file apa pun yang sedang dilihat oleh find
perintah, jadi kami memasukkan tanda kurung kurawal {}
untuk bertindak sebagai variabel kosong, atau parameter. Dengan kata lain, kami hanya meminta sistem untuk mengeluarkan string untuk setiap file di direktori.
";"
= ini diperlukan oleh find
dan merupakan tanda baca di akhir -exec
perintah kita . Lihat manual untuk 'temukan' untuk penjelasan lebih lanjut jika Anda membutuhkannya dengan menjalankan man find
.
| grep 'ASCII'
= |
adalah pipa. Pipa mengambil keluaran dari apapun yang ada di kiri dan menggunakannya sebagai masukan untuk apapun yang ada di sebelah kanan. Ini mengambil output dari find
perintah (string yang merupakan jenis file dari satu file) dan mengujinya untuk melihat apakah itu berisi string 'ASCII'
. Jika ya, hasilnya benar.
SEKARANG, ekspresi di sebelah kanan find ./
akan mengembalikan nilai benar saat grep
perintah mengembalikan nilai benar. Voila.
find . -type f -exec grep -Il "" {} \;
.