ยกเว้นไดเรกทอรีในการค้นหา


11

ฉันจะค้นหาทุกไฟล์และไดเรกทอรีที่ตรงกับรูปแบบโดยไม่รวมหนึ่งไดเรกทอรีได้findอย่างไร

ว่าฉันมีโครงสร้างไฟล์ดังต่อไปนี้

.
  foo-ยกเว้นฉัน /
    foo.txt
  foo-ยกเว้น-me-not /
    foo.txt
  บาร์/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

ฉันจะได้รับผลลัพธ์ต่อไปนี้โดยใช้find:

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

ฉันได้ลองใช้ทั้งสองคำสั่งต่อไปนี้:

หา -name 'foo-excluse-me' -prune -o -name 'foo *'
หา - ชื่อ 'foo *' \! -path './foo-exclude-me/*'

แต่ทั้งคู่กลับมานี้:

./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

ฉันจะแยกfoo-exclude-meไดเรกทอรีได้อย่างถูกต้องได้อย่างไร?


ลองใช้แทนfoo-exclude-me ./foo-exclude-meลองผนวกต่อ-printท้ายคำสั่งด้วย
n0pe

@ MaxMackie perfect :)
Tyilo

มันซ่อมได้หรือไม่ การแก้ไขแบบใดที่เหมาะกับคุณ ฉันสามารถใส่ไว้ในคำตอบแทนความคิดเห็น
n0pe

@MaxMackie ใช้ทั้ง-printและแทนfoo-exclude-me ./foo-exclude-me
Tyilo

น่ากลัวดูเหมือนว่ากิลส์ชนะฉันไปแม้ว่า :)
n0pe

คำตอบ:


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

ไม่มี-printการดำเนินการเริ่มต้นโดยปริยายนำไปใช้กับการแข่งขันทุกคนแม้กระทั่งตัดแต่ง ชัดเจน-printใช้เฉพาะภายใต้เงื่อนไขที่ระบุไว้ที่มีเฉพาะในสาขาอื่น-name 'foo*'-name 'foo-exclude-me'

โดยทั่วไปให้พูดอย่างชัดเจน-printทุกครั้งที่คุณทำอะไรที่ซับซ้อนกว่าภาคแสดง

ความพยายามครั้งที่สองของคุณด้วย! -path './foo-exclude-me/*'ไม่ทำงานเพราะ./foo-exclude-meไม่ตรงกัน./foo-exclude-me/*(ไม่มีส่วนท้าย/) การเพิ่ม! -path ./foo-exclude-meจะทำงาน


-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 19:30 ./a.out
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 20:59 ./b.out
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 20:59 ./c.out
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 20:59 ./d.out

.:
รวม 16
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 19:30 น
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 20:59 น
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 20:59 น
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 20:59 น
rm: ไม่สามารถลบ `. ': เป็นไดเรกทอรี
ls: ไม่สามารถเข้าถึง / b.out: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ls: ไม่สามารถเข้าถึง. / d.out: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ls: ไม่สามารถเข้าถึง. / c.out: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
.:
รวม 4
-rw-R - r-- 1 oradba dba 499 ม.ค. 18 19:30 น


ใช้ตัวเลือกลูกพรุนเพื่อข้าม a.out และใช้งานได้ดี - art.s
user211226

คุณไม่ได้อธิบายอย่างชัดเจนว่าทำไมจึง-pruneมีความเกี่ยวข้อง -pruneเป็นหนึ่งในตัวเลือกที่ซับซ้อนมากที่สุดที่จะfindทำให้' มันปิดการใช้งาน-print(ซึ่งจะเปิดใช้งานโดยค่าเริ่มต้น)
grochmal

- จริง True; หากไฟล์นั้นเป็นไดเร็กทอรีห้ามลงมาในไฟล์ - ดังนั้นจะไม่ทำงานในไดเรกทอรีเป็นการป้องกัน - art.s
user211226
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.