การใช้ค้นหาและลบไฟล์ / โฟลเดอร์ - ยกเว้น 1 โฟลเดอร์ - ท้าทาย


-2

ฉันต้องการใช้การค้นหาและลบทุกสิ่งด้วยข้อยกเว้นของหนึ่งโฟลเดอร์หากพบ เช่น

[oracle@SJOAM test]$ ls -l
total 4
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 a
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 b
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 c
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 d
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 e
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 f
-rw-r--r--. 1 oracle oinstall    0 Sep  2 02:05 g
drwxr-xr-x. 2 oracle oinstall 4096 Aug  7 07:25 test2

ฉันต้องการลบทุกอย่างยกเว้น test2

ดังนั้นฉันเริ่มต้นด้วย

[oracle@SJOAM test]$ find test2 -prune -o -print
[oracle@SJOAM test]$ 

ไม่ต้องส่งคืน

q1) ทำไมคำสั่งด้านบนโดยไม่มี -name แสดงไฟล์ที่เหลือ? แต่ด้วย "-name" ที่แสดงด้านล่างแสดงไฟล์ที่เหลือ?

[oracle@SJOAM test]$ find -name test2 -prune -o -print
.
./e
./a
./b
./d
./f
./g
./c

ด้วย -name ฉันสามารถดูไฟล์ที่เหลือได้ แต่ฉันยังสามารถเห็น "." โฟลเดอร์ปัจจุบัน

[oracle@SJOAM test]$ find -name test2 -prune -o -exec rm -r '{}' \;
rm: cannot remove directory: `.'
[oracle@SJOAM test]$ ls -l
total 4
drwxr-xr-x. 2 oracle oinstall 4096 Aug  7 07:25 test2

ไฟล์ทั้งหมดจะถูกลบออก แต่ฉันรู้สึกว่ามันไม่ใช่วิธีที่ถูกต้อง - พยายามลบ ""

q2) ฉันจะป้องกันการลบ "ได้อย่างไร" ?

นอกจากนี้

[oracle@SJOAM test]$ find test2
test2
test2/a9
test2/a8
test2/a7
test2/a10
[oracle@SJOAM test]$ find -name test2
./test2
[oracle@SJOAM test]$ 

q3) ทำไม -name จึงแสดง. /test แต่ไม่มี -name มันจะไม่แสดง "./"?


rm *. สิ่งนี้จะไม่ลบ test2 เพราะเป็นไดเรกทอรี
Cyrus

จะทำอย่างไรถ้าฉันต้องการลบไดเรกทอรีด้วย ... อื่น ๆ จากนั้น test2
Noob

คำตอบ:


0

มันใช้งานได้ดี

หา ! -name test2! - ชื่อ -exec rm -r '{}' \;

โดยการเพิ่ม! -name ...เราบอกให้พบว่าข้าม.และtest2วัตถุ

ตอบคำถามแรกของคุณจากman find:

ค้นหา [-H] [-L] [-P] [-D debugopts] [-Olevel] [path ... ] [expression]

ตามที่คุณเห็นถ้าคุณไม่มีตัวเลือกแรกก่อนหน้า[path...]นี้ให้ถือว่าอาร์กิวเมนต์แรกเป็นเส้นทางที่จะค้นหาดังนั้นเมื่อคุณทำfind test2 -prune -o -printมันจะแสดงรายการไฟล์ทั้งหมดในtest2โฟลเดอร์ แต่กลับผลลัพธ์เนื่องจากคำสั่งOR ที่สั่งซื้อโดย -prune -o คำตอบนี้เกี่ยวข้องกับคำถามที่สามของคุณด้วย


อะไรนะ! หมายถึงอะไร
Noob

!เป็นตัวnotดำเนินการเชิงตรรกะ ในกรณีนี้มันบอกให้ค้นหาnot match filenameเมื่อการแสดงออกเริ่มต้นของ -name คือmatch filename
Tim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.