Saya ingin bash saya mencetak 'ditemukan' hanya jika sesuatu ditemukan, menggunakan perintah find. Tetapi menggunakan && tidak membantu: bahkan jika tidak menemukan apa pun, saya 'dicetak' dicetak. Contoh:
$ pwd
/data/data/com.termux/files/home/test/test1/test4
$ ls
xaa xab
$ find . -name xac && echo 'found'
found
$ find . -name xaa && echo 'found'
./xaa
found
command-line
find
Josef Klimuk
sumber
sumber
/some/path
memberitahu menemukan tempat untuk mulai mencari, tetapi tidak ada yang memberi tahu apa yang harus dicari. Sama dengan jawaban tertaut Anda. Apa yang berhasil bagi sayafind /some/path -name xac -print0 -quit | grep -qz . && echo found
? Apakah saya melewatkan sesuatu?-print0 -quit
. Apa yang Anda masukkan sebelumnya tergantung pada apa yang ingin Anda temukan. Saya memilih untuk menghilangkan itu di sini.Jawaban muru sesuai dan cocok untuk kasus-kasus di mana kita ingin mencetak sesuatu jika file ditemukan. Untuk kasus umum ketika kita ingin mengeksekusi perintah eksternal, seperti
echo
, kita bisa menggunakan-exec
flag.Bagian
{}
meneruskan nama file ke perintah antara-exec
dan\;
sebagai argumen. Catat\
sebelum;
- ia mencegah shell dari salah mengartikannya ; di dalam koma penutupan shell menandakan akhir dari perintah, tetapi ketika lolos dengan slash, shell akan memperlakukannya sebagai teks literal untuk diteruskan kefind
perintah dan untuk menemukan perintah itu berfungsi sebagai-exec
argumen penutup flag.Untuk membangun kondisional
if found do this; else do that
semacam itu, kita dapat menggunakan substitusi perintah$()
dantest
perintah (alias[
):Mengatasi komentar Dan
Dan di komentar bertanya:
Mari kita pahami masalahnya dulu. Biasanya, dalam shell ada konsep pemisahan kata, yang berarti variabel yang tidak dikutip dan parameter posisi akan diperluas dan diperlakukan sebagai item terpisah. Misalnya, jika Anda memiliki variabel
var
dan itu berisihello world
teks, ketika Anda melakukannyatouch $var
shell akan memecahnya menjadi dua item yang terpisahhello
danworld
dantouch
akan memahami bahwa seolah-olah Anda mencoba membuat 2 file terpisah; jika Anda melakukannyatouch "$var"
, maka shell akan memperlakukanhello world
sebagai satu unit, dantouch
akan membuat satu file saja. Ini penting untuk dipahami bahwa ini terjadi hanya karena cara kerja cangkang.Sebaliknya,
find
tidak menderita perilaku seperti itu, karena perintah diproses denganfind
sendirinya dan dieksekusi olehexecvp()
system call, jadi tidak ada shell yang terlibat. Sementara kurung kurawal memang memiliki arti khusus dalam cangkang, karena mereka muncul di tengah-tengahfind
perintah, dan tidak pada awalnya, mereka tidak memiliki arti khusus untuk shell dalam kasus ini. Ini sebuah contoh. Mari kita membuat beberapa nama file yang sulit dan mencoba untuk memberikannya sebagai argumen untukstat
perintah.Seperti yang Anda lihat,
stat
menerima nama file yang sulit dengan baikfind
, yang merupakan salah satu alasan utama mengapa dianjurkan untuk digunakan dalam skrip portabel, dan terutama berguna ketika Anda melintasi pohon direktori dan ingin melakukan sesuatu dengan nama file yang mungkin berpotensi memiliki karakter khusus di dalamnya. Oleh karena itu, tidak perlu mengutip kurung kurawal untuk perintah yang dieksekusi difind
.Ini adalah cerita yang berbeda ketika shell terlibat. Terkadang Anda perlu menggunakan shell untuk memproses nama file. Dalam hal itu, mengutip memang akan penting, tetapi penting untuk menyadari bahwa itu bukan masalah menemukan - itu adalah shell yang melakukan pemisahan kata.
Jadi ketika kami mengutip dalam shell , itu akan berhasil. Tapi sekali lagi, itu penting untuk shell, bukan
find
.sumber
echo "I found {}"
lebih baik dari ituecho "I found " {}
? Mungkin untuk gema tidak masalah, tetapi jika seseorang menyalin perintah dan mengganti gema dengan perintah lain, mereka mungkin memiliki masalah.