บรรทัดคำสั่ง: piping ค้นหาผลลัพธ์เป็น rm


140

ฉันพยายามหาคำสั่งที่ลบไฟล์ sql ที่เก่ากว่า 15 วัน

ส่วนการค้นหาทำงานได้ แต่ไม่ใช่ rm

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

มันเปิดรายชื่อไฟล์ที่ฉันต้องการลบ แต่ไม่ได้ลบทิ้ง เส้นทางถูกต้อง

usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


274

คุณเป็นจริงท่อrmของการส่งออกfindการป้อนข้อมูลของ สิ่งที่คุณต้องการคือการใช้ผลลัพธ์ของการfindเป็นอาร์กิวเมนต์เพื่อrm:

find -type f -name '*.sql' -mtime +15 | xargs rm

xargsเป็นคำสั่งที่ "แปลง" อินพุตมาตรฐานเป็นอาร์กิวเมนต์ของโปรแกรมอื่นหรือตามที่วางไว้บนmanหน้าอย่างแม่นยำมากขึ้น

สร้างและดำเนินการบรรทัดคำสั่งจากอินพุตมาตรฐาน

โปรดทราบว่าหากชื่อไฟล์สามารถมีอักขระช่องว่างคุณควรแก้ไขให้ถูกต้อง:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

แต่จริงๆแล้วfindมีทางลัดสำหรับสิ่งนี้: -deleteตัวเลือก:

find -type f -name '*.sql' -mtime +15 -delete

โปรดระวังคำเตือนต่อไปนี้ในman find:

  Warnings:  Don't  forget that the find command line is evaluated
  as an expression, so putting -delete first will make find try to
  delete everything below the starting points you specified.  When
  testing a find command line that you later intend  to  use  with
  -delete,  you should explicitly specify -depth in order to avoid
  later surprises.  Because -delete  implies  -depth,  you  cannot
  usefully use -prune and -delete together.

PS โปรดทราบว่าการวางท่อโดยตรงกับrmไม่ใช่ตัวเลือกเพราะrmไม่คาดหวังชื่อไฟล์ในอินพุตมาตรฐาน สิ่งที่คุณกำลังทำอยู่คือการส่งกลับ


1
ขอบคุณ ฉันอ่าน man page และลองตั้งค่าสถานะนั้น ฉันผ่านเส้นทางเต็ม แต่กลับ "/ usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /: เส้นทางสัมพัทธ์อาจไม่ปลอดภัย" มีความคิดอะไรไหม
jerrygarciuh

1
@jerrygarciuh ใช้เวลาดูที่นี่
Lev Levitsky

ขอบคุณ ฉันไม่แน่ใจว่าฉันติดตามโพสต์ได้ดี แต่เมื่อฉันลอกเลียนแบบโซลูชันของพวกเขาและลบ -delete เมื่อสิ้นสุดคำสั่งมันลบไฟล์ sql ทั้งหมดโดยไม่คำนึงถึงเวลา mod ... แต่มันไม่มีคำเตือนดังนั้นฉันเดา นั่นคือความคืบหน้า ...
jerrygarciuh

1
@jerrygarciuh Ouch ฉันหวังว่าไม่มีอะไรมีค่าหายไป ... manพูดว่า: When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises.ฉันไม่แน่ใจว่าสิ่งที่จะมีตัวเลือกอื่น ๆ ที่คุณใช้แม้ว่า แต่คุณลอง?
Lev Levitsky

ไม่ฉันไม่ได้ แต่ไม่มีอะไรหายไป ไฟล์เหล่านี้ rsync-ed จากเซิร์ฟเวอร์อื่นที่เก็บไว้
jerrygarciuh

26
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

จะเลือกไฟล์ที่/usr/www/bar/htdocsเก่ากว่า 15 วันและลบออก


ฉันชอบคำตอบของคุณมากกว่าคำตอบที่ยอมรับเพราะ "ช่องว่างในชื่อ" จัดการได้ดีกว่าด้วยคำสั่ง "-exec" มากกว่าไปป์ ขอบคุณ
Slim Aloui

3

อีกวิธีที่ง่ายกว่าคือการใช้locateคำสั่ง xargsจากนั้นท่อผลให้

ตัวอย่างเช่น,

locate file | xargs rm

2

สมมติว่าคุณไม่ได้อยู่ในไดเรกทอรีที่มีไฟล์สำรอง * .sql:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

ตัวเลือก -v ด้านบนมีประโยชน์มากมันจะให้ผลลัพธ์ที่ไฟล์จะถูกลบเมื่อลบออก

ฉันต้องการแสดงรายการไฟล์ที่จะถูกลบก่อนเพื่อความแน่ใจ เช่น:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.