(2 jawaban)
Tutup 11 bulan lalu.
Sepertinya 'find', 'bash' dan 'sed' dalam beberapa kasus tidak berfungsi seperti yang diharapkan.
Contoh berikut pertama-tama harus membuat file 'sample.txt', kemudian menemukan file dan akhirnya memprosesnya dengan perintah '-exec'. Perintah yang dieksekusi mencetak nama file yang ditemukan, spesimen uji, dan nama file yang dimodifikasi. Perintah 'sed' sendiri digunakan untuk mengganti 'txt' menjadi 'TXT'.
touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;
Keluaran yang diharapkan adalah:
./sample.txt Specimen_before.TXT ./sample.TXT Specimen_after.TXT
Sebaliknya ia menghasilkan:
./sample.txt Specimen_before.TXT ./sample.txt Specimen_after.TXT
(contoh telah diuji juga dengan substitusi perintah jadul melalui backquotes ''`' dengan hasil yang sama)
Apa yang saya lakukan salah?
Jawaban yang Diterima:
Substitusi perintah dijalankan sebelum find
bahkan dimulai. Perintah aktual yang dijalankan (setelah penggantian, perluasan, penghapusan kutipan, dll.) adalah
find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;
Jika Anda perlu menjalankan apa saja mewah (pipa atau beberapa perintah) dengan -exec
, lalu mulai shell terpisah untuk melakukannya:
find . -maxdepth 1 -type f -name '*.txt'
-exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'