Saya ingin menampilkan semua direktori, yang tidak mengandung file dengan akhiran file tertentu. Karena itu saya mencoba menggunakan kode berikut:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
Dalam contoh ini saya ingin menampilkan semua direktori, yang tidak berisi file dengan akhiran .ENDING
, tetapi ini tidak berfungsi.
Di mana kesalahan saya?
Jawaban:
Inilah solusi dalam tiga langkah:
sumber
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
Kita mulai!
Atau secara bergantian (dan lebih banyak pythonic):
Konten Bonus DLC!
Versi (sebagian besar) dari perintah find:
sumber
test: ...: binary operator expected
jika ada beberapa*.ENDING
file dalam direktori.next(filter(lambda x: x.endswith('.ENDING'), filenames))
bisa juga ditulis menggunakan pemahaman generator yaitunext(x for x in filenames if x.endswith('.ENDING'))
.if not any(x.endswith('.ENDING') for x in filenames)
berdasarkan fakta bahwa setiap pengembalianFalse
untuk iterable kosong.Shell memperluas
*
, tetapi dalam kasus Anda tidak ada shell yang terlibat, hanya perintah uji yang dijalankan oleh find . Oleh karena itu file yang keberadaannya diuji, secara harfiah diberi nama*.ENDING
.Sebaliknya, Anda harus menggunakan sesuatu seperti ini:
Ini akan menghasilkan sh ekspansi
*.ENDING
ketika tes dijalankan.Sumber: temukan globbing di UX.SE
sumber
-c: line 0: syntax error near unexpected token
('`. Nama direktori saya memiliki format' xyz (dfdf) '. Sebenarnya ini adalah perpustakaan kaliber.sh: line 0: test: foo1/bar.ENDING: binary operator expected
direktori yang berisi file dengan akhiranENDING
.sh: -c: line 0: syntax error near unexpected token
('sh: -c: baris 0:' test -e test (test) / *. Ending '. / test (test) `. Tapi ketika saya mengubah .ending ke .xyz saya mendapatkan hasil yang sama. Ini karena saya memiliki bracts sebagai nama direktori, kan? Bagaimana saya bisa memperbaikinya?Terinspirasi oleh jawaban Dennis Nolte dan MikeyB , saya datang dengan solusi ini:
Ini bekerja berdasarkan fakta bahwa
Ngomong-ngomong, itu sebabnya stderr dialihkan ke
/dev/null
.sumber
Saya akan melakukannya di perl secara pribadi
Harus melakukan trik (bekerja pada test case saya yang sangat sederhana).
sumber
Inilah satu-satunya liner.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u
Sunting : Ups, tidak akan berfungsi.
sumber
q
di egrep adalah untuk tenangDengan
egrep
Anda dapat menukar regex yang Anda butuhkanls -1 "{}"
menampilkan nama file dari perintah findsumber