Jangan gunakan substitusi perintah pada output darifind
. Di sini, semuanya bisa dilakukan dengan find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
Dengan beberapa find
implementasi (termasuk FreeBSD dari find
mana asalnya dan GNU find
), Anda dapat menggunakannya -delete
sebagai gantinya -exec rm...
.
Alasan Anda mendapatkan kesalahan adalah karena tidak ada perintah di antara then
dan else
dan beberapa shell (dimulai dengan shell Bourne dari mana sintaks itu berasal) memerlukan setidaknya satu (dan komentar bukan perintah). Perhatikan bahwa itu sepenuhnya arbitrer dan tidak ada alasan mengapa cangkang itu melakukan itu. yash
dan zsh
tidak memiliki batasan itu ( if false; then else echo x; fi
dan bahkan if false; then else fi
bekerja dengan baik dengan mereka).
Seperti yang orang lain katakan, Anda dapat menggunakan perintah noop seperti :
(atau for nothing in; do nothing; done
) atau membalikkan logika dengan !
kata kunci (tersedia dalam shell POSIX, tetapi tidak pada shell Bourne (Anda akan menemukan bahwa menggunakan :
untuk yang umum di shell itu)). mksh
dan yash
kebetulan mendukung if false; then () else echo x; fi
(saya tidak akan mengandalkan itu karena itu bisa berubah di versi masa depan).
Pendekatan lain adalah dengan:
lsof... || {
cmd1
cmd2
}
meskipun satu perbedaan adalah status keluar keseluruhan yang akan menjadi lsof
jika lsof
gagal.
-exec
sering berguna, sepertixargs
, kadang-kadang dibutuhkan loop shell. Dalam hal iniwhile read name
loop adalah opsi yang disukai (dalam bash dengan GNU menemukan Anda dapat menggunakan opsi -0 untuk keduanya; Anda harus menyerah pada baris baru).-print0
adalah-exec printf '%s\0' {} +
(tapi Anda tidak bisa berurusan dengan output itu kecuali jika Anda ingin mempertimbangkanperl
), dan denganfind .//.
dan beberapa post-processing, Anda dapat keluar dari baris baruxargs
. Perhatikan bahwa ini bukanwhile read
, ituwhile IFS= read -r
.Tampaknya Anda ingin melakukan no-op jika file terbuka sehingga Anda harus menambahkan
:
, yang merupakan perintah nol dibash
:Jika Anda tidak menggunakan
:
,bash
tidak dapat menguraikan kode Anda, dan akan menampilkan kesalahan sepertibash: syntax error near unexpected token 'else'
.sumber
:
dan ini adalah perintah pertama yang terdaftar di bash-builtin.Alternatif lain: balikkan logika Anda.
sumber
TL; DR
Tidak ada jawaban lain yang benar-benar menjawab pertanyaan awal Anda mengapa perintah tersebut memberikan kesalahan sintaksis. Ini disebabkan oleh perintah yang hilang antara itu dan yang lain .
Perintah yang Hilang
Kode asli Anda terlihat seperti ini:
Masalahnya adalah Anda memiliki komentar antara saat itu dan yang lain , tetapi komentar tersebut tidak diperlakukan sebagai perintah. Singkatnya, Anda dapat menulis ulang masalah yang Anda miliki (secara struktural) sebagai berikut:
Perbaiki Sintaks Anda dengan Bourne Builtin
Anda dapat memperbaiki masalah ini dengan menempatkan perintah yang sebenarnya sebelum yang lain , tetapi komentar dengan sendirinya tidak akan melakukannya. Bagian jika-maka tidak boleh kosong; Jika Anda menginginkan placeholder, Anda dapat menggunakan builtin titik dua . Sebagai contoh:
Cukup menempatkan
:
ke bagian antara itu dan yang lain akan memperbaiki kesalahan sintaks yang Anda alami.sumber
$ ; -bash: syntax error near unexpected token ';'