Kecualikan direktori di temukan

11

Bagaimana saya dapat menemukan setiap file dan direktori yang cocok dengan suatu pola, tidak termasuk satu direktori menggunakan find?

Katakanlah saya memiliki struktur file berikut;

.
  foo-exclude-me /
    foo.txt
  foo-exclude-me-not /
    foo.txt
  batang/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

bagaimana saya mendapatkan output berikut menggunakan find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Saya telah mencoba menggunakan kedua perintah berikut:

Temukan . -nama 'foo-kecualikan-saya' -prune -o -name 'foo *'
Temukan . -nama 'foo *' \! -path './foo-exclude-me/*'

tetapi keduanya mengembalikan ini:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Bagaimana saya bisa mengecualikan foo-exclude-medirektori dengan benar?

Tyilo
sumber
Coba gunakan foo-exclude-mesebagai ganti ./foo-exclude-me. Coba juga tambahkan -printdi akhir perintah.
n0pe
@ MaxMackie sempurna :)
Tyilo
Itu memperbaikinya? Perbaikan apa yang berhasil untuk Anda? Saya bisa memasukkannya dalam jawaban, bukan komentar.
n0pe
@ Maxmackie menggunakan keduanya -printdan foo-exclude-mebukannya ./foo-exclude-me.
Tyilo
Luar biasa, sepertinya Gilles mengalahkan saya untuk itu :)
n0pe

Jawaban:

11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

Tanpa -print, tindakan default implisit berlaku untuk setiap pertandingan, bahkan yang dipangkas. Secara eksplisit -printhanya berlaku di bawah kondisi yang ditentukan, yang -name 'foo*'hanya di cabang lain dari -name 'foo-exclude-me'.

Secara umum, gunakan eksplisit -printsetiap kali Anda melakukan sesuatu yang lebih kompleks daripada gabungan predikat.

Upaya kedua Anda dengan ! -path './foo-exclude-me/*'tidak berhasil karena ./foo-exclude-metidak cocok ./foo-exclude-me/*(tidak ada jejak /). Menambahkan ! -path ./foo-exclude-meakan berhasil.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
-2
-bash-4.1 $ find. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 18 Jan 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 18 Jan 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 18 Jan 20:59 ./c.out
-rw-r - r--. 1 oradba dba 499 18 Jan 20:59 ./d.out

.:
total 16
-rw-r - r--. 1 oradba dba 499 18 Jan 19:30 a.out
-rw-r - r--. 1 oradba dba 499 18 Jan 20:59 b
-rw-r - r--. 1 oradba dba 499 18 Jan 20:59 c.out
-rw-r - r--. 1 oradba dba 499 18 Jan 20:59 d.out
rm: tidak dapat menghapus `. ': Adalah direktori
ls: tidak dapat mengakses ./b.out: Tidak ada file atau direktori tersebut
ls: tidak dapat mengakses ./d.out: Tidak ada file atau direktori tersebut
ls: tidak dapat mengakses ./c.out: Tidak ada file atau direktori tersebut
.:
total 4
-rw-r - r--. 1 oradba dba 499 18 Jan 19:30 a.out

pengguna211226
sumber
Menggunakan opsi prune untuk melewati a.out dan bekerja dengan baik - art.s
user211226
Anda sama sekali tidak menjelaskan mengapa -pruneitu relevan. -pruneadalah salah satu opsi paling berbelit-belit untuk find'menyebabkannya dinonaktifkan -print(yang diaktifkan secara default)
grochmal
-tepat Benar; jika file tersebut adalah direktori, jangan turun ke dalamnya. - Jadi itu tidak akan bekerja dengan sendirinya ke direktori sebagai perlindungan. - art.s
user211226