ค้นหาไฟล์ใหม่กว่าวันและคัดลอก


12

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

นี่คือสิ่งที่ฉันมี:

find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \;

รหัสด้านบนคัดลอกไฟล์ทั้งหมดในไดเรกทอรีต้นทาง หากฉันลบข้อโต้แย้งทั้งหมดสำหรับ 'cp' มันจะทำงานได้:

find . -mtime -1 -exec cp "{}" /somefolder \;

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

ฉันได้ลองตัวแปรแล้วและสำหรับการวนรอบคิดว่าตัวเลือก -exec อาจเป็นปัญหา:

files="$(find -mtime -1)"
for file in "$files"
do
cp --parents --preserve -a file /somefolder

อย่างไรก็ตามผลการวนซ้ำด้านบนในปัญหาเดียวกันไฟล์ทั้งหมดจะถูกคัดลอก หากฉัน echo $ files เฉพาะไฟล์ที่ฉันต้องการจะแสดง

ฉันจะทำให้เรื่องนี้ทำงานได้อย่างไร


1
โอเคฉันคิดว่าฉันใช้งานได้แล้ว:find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;
mac1234

rsync จะไม่เป็นเครื่องมือที่ดีกว่าสำหรับงานนี้แทนที่จะเป็น cp หรือไม่ rsync -a จุดหมายปลายทาง
Darryl

คำตอบ:


9

การใช้งานบางอย่างcpมี-tตัวเลือกดังนั้นคุณสามารถวางไดเรกทอรีเป้าหมายไว้หน้าไฟล์:

find . -mtime -1 -exec cp -a --parents -t /somefolder "{}" \+

โปรดทราบว่า-aมีความหมาย--preserveดังนั้นฉันลบหลัง


สิ่งนี้จะคัดลอกโฟลเดอร์ที่มีไฟล์เก่า ... ?
Luis A. Florit

3

คุณสามารถใช้paxสิ่งนี้เช่น:

pax -wrT "11$(date +%H%M)," . /destination/folder

บรรทัดคำสั่งทีละบิต:

  • -wr- เมื่อpaxส่งตัวเลือกทั้ง-wพิธีและ-rอี๊ดก็จะคัดลอก อาจมีประโยชน์ที่นี่ (แต่ไม่รวมอยู่ในคำสั่งด้านบน)

    • -link - ซึ่งสร้างลิงค์ยากหากเป็นไปได้แทนที่จะคัดลอกไฟล์ข้อมูล

    • -Xสำหรับ จำกัดpaxอุปกรณ์ต้นทางและ / หรือระบบไฟล์เดียวกัน

    • -s/src regex/replace/ - ซึ่งแก้ไขชื่อไฟล์ในสตรีม

    • -verbose - สำหรับการรายงานไฟล์ที่มา / กำหนดเป้าหมาย

  • -T- The -TIME ตัวเลือกเลือกไฟล์สำหรับการเก็บเป้าหมาย(หรือเป็นเพียงแค่การคัดลอกเมื่อใช้กับ-wr)บนพื้นฐานของพวกเขา/modification หรือ inode /change (หรือทั้งสอง)ครั้ง มันเริ่มต้นที่ mod เวลา จาก...

คนท่าน

  • ... การเปรียบเทียบเวลาโดยใช้ทั้งสองครั้งไฟล์จะมีประโยชน์เมื่อ pax ใช้เพื่อสร้างการเก็บถาวรแบบเพิ่มตามเวลา (เฉพาะไฟล์ที่เปลี่ยนแปลงระหว่างช่วงเวลาที่กำหนดเท่านั้นที่จะถูกเก็บถาวร)

  • ช่วงเวลาประกอบด้วยเขตข้อมูลที่แตกต่างกันหกเขตและแต่ละเขตข้อมูลจะต้องมีตัวเลขสองหลัก รูปแบบคือ:

    [[[[[cc]yy]mm]dd]HH]MM[.SS]

  • โดยccที่สองหลักแรกของปี (ศตวรรษ) yyเป็นตัวเลขสองหลักสุดท้ายของปีแรกmmคือเดือน (จาก 01 ถึง 12) ddคือวันของเดือน (จาก 01 ถึง 31) HHคือ ชั่วโมงของวัน (จาก 00 ถึง 23) MMคือนาที (จาก 00 ถึง 59) และSSเป็นวินาที (จาก 00 ถึง 59) ต้องการฟิลด์นาทีMMขณะที่ฟิลด์อื่นเป็นทางเลือกและต้องเพิ่มตามลำดับต่อไปนี้:

    HH, dd, mm, yy, cc

  • SSฟิลด์อาจจะเพิ่มเป็นอิสระจากสาขาอื่น ๆ ช่วงเวลาสัมพันธ์กับเวลาปัจจุบันดังนั้น ...

    -T 1234/cm

  • ... จะเลือกไฟล์ทั้งหมดที่มีการแก้ไขหรือเปลี่ยนแปลง inode เวลา 12:34 PM วันนี้หรือในภายหลัง

  • -Tสามารถระบุช่วงเวลาได้หลายช่วงและตรวจสอบการหยุดด้วยคู่แรก

... ดังนั้น11คำสั่งขึ้นบนของฉันนั้นสัมพันธ์กับวันนี้ - มันน้อยกว่าวันที่วันนี้ - ซึ่งคือวันที่สิบสอง - และส่วนที่เหลือเป็นเพียง"$(date)"รูปแบบมาตรฐานตามด้วยเครื่องหมายจุลภาค

... ยกเว้น - และสิ่งสุดท้ายที่ควรพูดถึง - ฉันใช้เส้นทางสัมบูรณ์สำหรับไดเรกทอรีเป้าหมาย - และคุณควรทำเช่นนั้นหรือไม่ เอกสารอ้างอิงทั้งหมดไม่มีการระบุพฤติกรรมสำหรับเส้นทางเป้าหมายสัมพัทธ์ - และเป็นครั้งแรกที่ฉันเคยลองใช้paxฉันสาบานภายใต้ลมหายใจเป็นเวลาหนึ่งชั่วโมงด้วยความสับสนกับผลลัพธ์แปลก ๆ ทั้งหมดจนกว่าฉันจะใช้เส้นทางสัมบูรณ์


2

ขอบคุณทุกคนสำหรับความช่วยเหลือทำให้มันทำงานโดยใช้คำแนะนำของคุณ:

ไปกับรหัสด้านล่างและมันทำงานได้อย่างสมบูรณ์

find /sourcefolder -type f -mtime -1 -exec cp -a "{}" /somefolder \;

ขอบคุณอีกครั้ง!


2

ฉันทำงานเหมือนกันทุกอย่าง แต่ต้องการรักษาโครงสร้างโฟลเดอร์ไว้ ดังนั้นสิ่งที่ฉันได้ทำแตกต่างกันเล็กน้อย

cd sourcedir
find . -type f -mtime -$days -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

โดยที่ $ days คือจำนวนวัน $ tarpath เป็นเส้นทางชั่วคราวสำหรับการจัดเก็บไฟล์เหล่านี้ และเมื่อฉันต้องการคืนค่า

cd $destdir
tar -xvzf ${tarpath}/testtar.tar.gz

ที่ได้ทำเคล็ดลับสำหรับฉัน

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

find . -type f -mtime -$days ! -path '*/FolderToavoidSearch/*' -print0 | tar -czvf ${tarpath}/testtar.tar.gz --null -T -

ข้อได้เปรียบ: 1. ฉันมีสำเนาของสิ่งที่ฉันกู้คืนครั้งล่าสุดในรูปแบบที่บีบอัดเสมอ

  1. ฉันยังมีการหยุดชั่วคราวในระหว่างการคืนค่าที่ฉันสามารถไปและตรวจสอบสิ่งที่เป็นไฟล์เหล่านั้นและถ้าทั้งหมดตกลงแล้วดำเนินการกับสคริปต์

  2. มันเก็บรักษาโครงสร้างของโฟลเดอร์ดังนั้นมันจึงเพิ่งเขียนทับไฟล์ที่แก้ไขจากไดเรกทอรีแหล่งลงในไดเรกทอรีปลายทาง

หมายเหตุ: ในทางกลับกันหากความต้องการไม่ได้ จำกัด วันฉันจะใช้ rsync

rsync -avz --exclude 'FolderToavoidSearch' --backup --backup-dir="/backup/dir/test/backup_$(date +\%Y-\%m-\%d)" /source/dir/ /dest/dir/

มากขึ้นสำหรับ rsyc พร้อมกับวันที่นี่


1

ท่านสามารถเลือกวันที่และเวลาที่แน่นอนนอกเหนือไปจากการย้อนกลับไปยังจำนวนวันที่แน่นอน

(ใช้งานได้ดีในกรณีที่ชื่อไฟล์ของคุณไม่มีที่ว่างแท็บหรืออักขระตัวแทนในนั้น)

cp `find . -type f -newermt '17 dec 2016 20:10:00'` FOLDER

ด้านบนคัดลอกไฟล์ทั้งหมดในไดเรกทอรีที่สร้างขึ้นหลังจากวันที่ 17 ธันวาคม 2016 20:10:00 ไปยังโฟลเดอร์ (1 วันก่อนวันนี้ :)

ระวังด้วยสัญลักษณ์สำหรับคำสั่ง find มันไม่ใช่สิ่งนี้: 'มันคือสิ่งนี้, backtick: `การเลือกวันที่เป็นสิ่งนี้:'

สำหรับไฟล์ที่มีช่องว่างแท็บบรรทัดใหม่หรือสัญลักษณ์ตัวแทนในชื่อของพวกเขาคุณสามารถใช้วิธีแก้ปัญหาจากStéphane Chazelas อย่างใดอย่างหนึ่งก่อนสำหรับ GNU ที่สองคือ GNU หรือ BSD บางส่วน:

find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} + 
find . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +


ขอบคุณสเตฟานนั่นอาจเป็นสาเหตุที่ฉันไม่พบสิ่งนี้ในโพสต์ใด ๆ แต่สำหรับกรณีของฉันมันใช้งานได้อย่างมีเสน่ห์ เมื่อคุณทำเช่นนี้หาเท่านั้น -type f -newermt '17 Dec 2016 20:10:00 '
FatihSarigol

... มันพิมพ์ไฟล์ที่สร้างขึ้นหลังจากเวลานั้นฉันไม่แน่ใจว่ามันเป็นปัญหาแบบไหน จากนั้นฉันเพียงใช้ backticks เพื่อเลือกไฟล์เหล่านี้ที่จะคัดลอก ไชโย
FatihSarigol

ฉันเชื่อว่าโพสต์ที่คุณแบ่งปันเป็นเรื่องเกี่ยวกับ "วนรอบ" รหัสของฉันวนไปตามผลการค้นหาหรือไม่ หรือเป็นเพียงการเลือกผลลัพธ์การค้นหาที่จะใช้โดยการคัดลอก (ขออภัยสำหรับ 3 ความคิดเห็นเห็นได้ชัดว่าฉันไม่ได้รับอนุญาตให้แก้ไขความคิดเห็นของฉัน
FatihSarigol

1
Use find . -type f -newermt '17 dec 2016 20:10:00' -exec cp -t FOLDER {} +(GNU) หรือfind . -type f -newermt '17 dec 2016 20:10:00' -exec sh -c 'cp "$@" FOLDER' sh {} +(GNU หรือ BSDs บางตัว (ความสามารถในการจำกัดความพกพาของ wrt คือ-newermtpredicate ที่นี่)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.