ย้ายไฟล์ไปยังไดเรกทอรีอื่นที่เก่ากว่าวันที่


28

ฉันกำลังมองหาวิธีแก้ปัญหาเพื่อย้ายไฟล์ที่เก่ากว่าปีนับจากวันนี้ พาร์ทิชันบันทึกของฉันกำลังเต็ม แต่ฉันไม่สามารถลบออกได้ พวกเขามีความจำเป็นเป็นเวลานาน อย่างไรก็ตามวิธีแก้ไขปัญหาหนึ่งที่ฉันพบคือ:

find /sourcedirectory -mtime 365 -exec mv "{}" /destination/directory/ \;

จะใช้งานได้ไหม ถามเพราะ " -mtime 365 " สิ่งนี้จะย้ายไฟล์ที่เก่ากว่าตั้งแต่วันนี้ไปยังตำแหน่งใหม่หรือไม่?

ขอขอบคุณ!

คำตอบ:


40

คุณพูดถูกแล้ว -mtime 365จะเป็นไฟล์ทั้งหมดที่มีอายุ 365 วัน คุณต้องการคนที่มี 365 วันเก่าหรือมากขึ้นซึ่งหมายถึงการเพิ่มก่อนจำนวนเช่นนี้+-mtime +365

นอกจากนี้คุณยังอาจสนใจการ-maxdepth 1ตั้งค่าสถานะซึ่งป้องกันไม่ให้คุณย้ายรายการในไดเรกทอรีย่อย

หากคุณต้องการให้แน่ใจว่าคุณเป็นเพียงการย้ายไฟล์ไม่ใช่ไดเรกทอรีให้เพิ่ม-type fในบรรทัด

ในตอนท้ายของบรรทัดที่เราเพิ่ม\;เพื่อให้findรู้ว่าเป็นจุดสิ้นสุดของคำสั่งที่เรากำลังดำเนินการ

ดังนั้นบรรทัดควรเป็น:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec mv "{}" /destination/directory/ \;

หากต้องการอยู่อย่างปลอดภัยให้เริ่มต้นด้วยการทำ ls -l แทนที่จะเป็น mv วิธีที่คุณสามารถตรวจสอบล่วงหน้าว่าคุณได้รับไฟล์ที่คุณต้องการอย่างแท้จริงก่อนที่จะรันด้วย mv เช่นนี้:

find /sourcedirectory -maxdepth 1 -mtime +365 -type f -exec ls -l {} \;

3
จำไว้ว่าmtimeเป็นเวลาแก้ไข (ซึ่งฟังดูเหมือนสิ่งที่คุณต้องการ - ส่วนใหญ่เป็นเวลา) หากมีการอ่าน / อ้างอิงบันทึกเหล่านี้บ่อยครั้งคุณอาจต้องการใช้-atime(เวลาเข้าถึงล่าสุด)
voretaq7

2
แบ็กสแลชที่ส่วนท้ายของบรรทัดนี้ทำอะไร
Ben Liyanage

1
@BenLiyanage แบ็กสแลชเป็นอักขระเลี่ยงสำหรับอัฒภาคที่ตามมา เครื่องหมายอัฒภาคหมายถึงจุดสิ้นสุดของexecข้อความ findดูหน้าคนสำหรับ
Jenny D พูดว่า Reinstate Monica

4

ระวังเมื่อใช้วิธีแก้ปัญหาข้างต้นฉันใช้มันและลงเอยด้วยการย้ายไฟล์ทั้งหมดในโฟลเดอร์ย่อยทั้งหมด !!!!

คำสั่งนี้ย้ายไฟล์ทั้งหมดใน / source directory และโฟลเดอร์ย่อยทั้งหมดภายใต้ directory source:

find /sourcedirectory -mtime +365 -exec mv "{}" /destination/directory/ \;

ให้ใช้ตัวเลือก -maxdepth 1 สำหรับไฟล์ใน / sourcedirectory เท่านั้น

find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

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

1
ไม่ฉันหมายความว่า 'ค้นหา' จะค้นหาไฟล์ทั้งหมดใน / sourcedirectory และโฟลเดอร์ย่อยทั้งหมดภายใน / sourcedirectory ซึ่งฉันไม่ได้คิดตอนนั้น '-maxdepth 1' จำกัด 'ค้นหา' เฉพาะ / sourcedirectory
harleygolfguy

BTW ฉันจะได้รับสิ่งนี้เป็นเพียงความเห็นต่อคำตอบที่ได้รับคะแนนสูงสุดซึ่งเป็นคำตอบที่ดี แต่ฉันไม่มีชื่อเสียง :)
harleygolfguy

0

คุณสามารถใช้คำสั่งนี้และระบุว่าคุณค้นหาไฟล์ไม่ใช่ไดเร็กตอรี่และไฟล์นั้นเก่ากว่าหนึ่งปี

find /sourcedirectory -type f -mtime +365 -exec mv "{}" /destination/directory/ \;

ทำไมเขาต้องใช้rm? คำสั่งของคุณจะลบทั้งไฟล์บันทึกและไดเรกทอรีปลายทาง
Sven

อ๊ะผิดฉันคิดว่า @mYzk ต้องการลบไฟล์นี้ แก้ไขแล้ว
cuonglm

0

คุณสามารถใช้คำสั่งด้านล่างกับ atime หากไฟล์มีการเข้าถึงบ่อย

find /sourcedirectory -type f -atime +365 -exec mv -t /destinationdirectory {} +;

0
$ find /sourcedirectory/ -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

find: missing argument to `-exec'

การแก้ไขจะเป็นการลบเครื่องหมายสแลชต่อท้ายออกจาก /sourcedirectory/

$ find /sourcedirectory -maxdepth 1 -mtime +365 -exec mv "{}" /destination/directory/ \;

ในการทดสอบของฉันฉันไม่สามารถทำซ้ำfind: missing argumentข้อผิดพลาดได้ แต่ฉันยอมรับว่าการปล่อยเครื่องหมายทับ/sourcedirectoryถูกต้อง
guzzijason
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.