เท่าที่ฉันรู้ไม่มีตัวเลือกที่จะบอกfind
ให้อ่านรูปแบบจากไฟล์ วิธีแก้ปัญหาที่ง่ายคือการบันทึกรูปแบบที่ฉันต้องการที่จะไม่รวมอยู่ในแฟ้มและส่งผ่านไฟล์ที่เป็น input grep
สำหรับย้อนกลับ ตัวอย่างเช่นฉันได้สร้างไฟล์และไดเรกทอรีต่อไปนี้:
$ tree -a
.
├── a
├── .aa
├── .aa.bak
├── a.bck
├── b
├── .dir1
│ └── bb1.bak
├── dir2
│ └── bb2.bak
├── b.bak
├── c
├── c~
├── Documents
│ └── Documents.bak
├── exclude.txt
├── foo.backup
└── Music
└── Music.bak
ถ้าผมเข้าใจตัวอย่างที่คุณโพสต์ได้อย่างถูกต้องที่คุณต้องการย้ายa.bck
, .aa.bak
, b.bak
, c~
, foo.backup
และdir2/bb2.bak
ไปที่ถังขยะและลา.aa.bak
, .dir1/bb1.bak
, Documents/Documents.bak
และMusic/Music.bak
พวกเขาอยู่ที่ไหน ฉันได้สร้างไฟล์exclude.txt
ด้วยเนื้อหาต่อไปนี้ (คุณสามารถเพิ่มได้มากเท่าที่คุณต้องการ):
$ cat exclude.txt
./.*/
./Music
./Documents
ฉันใช้./.*/
เพราะฉันเข้าใจการค้นหาดั้งเดิมของคุณหมายความว่าคุณต้องการย้ายไฟล์สำรองข้อมูลที่ซ่อนอยู่ ( .foo
) ซึ่งอยู่ในไดเรกทอรีปัจจุบัน แต่ไม่รวมไฟล์สำรองข้อมูลใด ๆ ที่อยู่ในไดเรกทอรีที่ซ่อนอยู่ ( .foo/bar
) ดังนั้นตอนนี้ฉันสามารถเรียกใช้find
คำสั่งและใช้grep
เพื่อแยกไฟล์ที่ไม่ต้องการ:
$ find . -type f | grep -vZf exclude.txt | xargs -0 --no-run-if-empty trash-put
ตัวเลือก Grep:
-v, --invert-match
Invert the sense of matching, to select non-matching
lines. (-v is specified by POSIX.)
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty
file contains zero patterns, and therefore matches
nothing. (-f is specified by POSIX.)
-Z, --null
Output a zero byte (the ASCII NUL character) instead of
the character that normally follows a file name. For
example, grep -lZ outputs a zero byte after each file
name instead of the usual newline. This option makes
the output unambiguous, even in the presence of file
names containing unusual characters like newlines.
This option can be used with commands like find
-print0, perl -0, sort -z, and xargs -0 to process
arbitrary file names, even those that contain newline
characters.