ย้ายไฟล์ตามวันที่ไปยังไดเรกทอรีอื่นโดยใช้ CLI


9

ฉันมีรูปภาพจำนวนมากจากฮาร์ดไดรฟ์เก่าที่ฉันพยายามจัดระเบียบ ถ้าฉันรันls -lฉันสังเกตว่าไฟล์เหล่านี้ทั้งหมดมีวันที่สร้างปี 2555 หรือก่อนหน้า โดยอุดมคติแล้วฉันต้องการย้ายสิ่งเหล่านี้ไปยังฮาร์ดไดรฟ์ที่สองของคอมพิวเตอร์ซึ่งไม่ได้ตั้งค่าให้ติดตั้งโดยอัตโนมัติ โดยเฉพาะอย่างยิ่งฉันสามารถทำสิ่งนี้ทั้งหมดเป็นชุดที่มีคำสั่งเชื่อมโยงกัน จนถึงตอนนี้ผมมีls -l | grep -i 2012ที่ถ่มน้ำลายออกเฉพาะไฟล์ที่มี 2012 ls -lในวันที่จัดไว้ให้โดย ทีนี้เคล็ดลับก็คือcp'ทุกไฟล์เหล่านั้นไปยังไดเรกทอรีใหม่ ฉันไม่แน่ใจว่าจะไปที่ไหนเพราะจะต้องคัดลอกแต่ละไฟล์ คำสั่งชุดถัดไปของฉันคืออะไร

คำตอบ:


13

lsอย่าใช้ ไม่แนะนำให้ใช้ในกรณีเช่นนี้ ยิ่งไปกว่านั้นการใช้grepตัวกรองตามวันที่ไม่ใช่ความคิดที่ดี ชื่อไฟล์ของคุณเองอาจมี2012สตริงแม้ว่าจะไม่ได้รับการแก้ไขในปี 2012

ใช้findคำสั่งและไพพ์เอาต์พุตของมัน

find . -newermt 20120101 -not -newermt 20130101 -print0 | xargs -0 cp -t /your/target/directory 

ที่นี่

-newermt 20120101  ==>  File's modified date should be newer than 01 Jan 2012
-not               ==>  reverses the following condition. Hence file should be older than 01 Jan 2013
-print0 and -0     ==>  Use this options so that the command doesn't fail when filenames contain spaces 

1
จะไม่ `-exec mv {} / your / target / directory \; ' แทน '-print 0 | xargs -0 cp -t / your / target / directory ทำงานได้ดีพอ ๆ กับปัญหาช่องว่างในชื่อ? (OP ยังต้องการย้ายไม่คัดลอก )
Hagen von Eitzen

^^ ใช่ ทั้งสองบรรลุเป้าหมายเดียวกัน
shivams

4

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

  1. สร้างไฟล์มาร์กเกอร์ชั่วคราวด้วยวันที่แก้ไขซึ่งแยกไฟล์ที่ฉันต้องการจากไฟล์ที่ฉันไม่ทำ
  2. คัดลอกไฟล์ที่เก่ากว่าไฟล์เครื่องหมายไปยังตำแหน่งใหม่

นี่คือตัวอย่างคำสั่งสำหรับสิ่งนี้ซึ่งถือว่าคุณต้องการรักษาลำดับชั้นไดเรกทอรีใด ๆ จากดิสก์เก่าในใหม่ ( cpioเป็นคำสั่งคัดลอกคล้ายกับtarหรือpax):

touch -t 201201010000 /tmp/marker    # YYYYMMDDhhmm == Jan 1st, 2012
cd /path/to/old/disk
find . -type f \! -newer /tmp/marker -print0 | cpio -pmd0 /path/to/new/disk

2

ฉันคิดว่าปัญหานี้อาจจะเหมือนกับคุณคุณก็สามารถลองดูได้ที่นี่: สร้างไดเรกทอรีย่อยและจัดการไฟล์ตามวันที่

ฉันเขียนสคริปต์ใหม่นี้ตามคำตอบแรกของปัญหา:

for x in *; do
  d=$(date -r "$x" +%Y)
  mkdir -p "/your/new/directory/$d"
  mv -- "$x" "/your/new/directory/$d/"
done
  1. เขียนสคริปต์นี้ไปยังไฟล์ชื่อcopy.shในไดเรกทอรีเก่าของคุณ

  2. แทนที่/your/new/directoryด้วยเส้นทางไดเรกทอรีใหม่ของคุณ

  3. ทำให้ไฟล์นี้ปฏิบัติการได้ด้วย chmod +x copy.sh

  4. จากนั้นเรียกใช้ไฟล์นี้โดย ./copy.sh


1
คุณอาจต้องการเพิ่มการจัดการข้อยกเว้นบางอย่างดังนั้นสคริปต์จะไม่ย้ายตัวเองไปยัง2015ไดเรกทอรี
G-Man กล่าวว่า 'Reinstate Monica'

1

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

มีcpioคำตอบที่เขียนไว้แล้วที่นี่ซึ่งมีเพียงตัวเลือกที่คุณได้เตรียมไว้แล้วเท่านั้นซึ่งเป็นไปได้ว่าฉันจะเลือก อย่างไรก็ตามcpioรูปแบบได้รับการปรับปรุงและพับลงในpaxรูปแบบเก็บถาวรมาตรฐานตั้งแต่รุ่งเรือง tarเช่นเดียวกับที่เป็นจริงของ

POSIX อย่างเคร่งครัด - paxจะไม่ให้ตัวเลือกใด ๆ สำหรับการกรองสมาชิกไฟล์เก็บถาวรโดยตรงตามเวลาในการแก้ไขไฟล์ - แม้ว่ามาตรฐานจะระบุ%Tรูปแบบการปรับเปลี่ยนโหมดรายการ ถึงกระนั้นการใช้paxงานที่มีอยู่ทั่วไปที่ฉันรู้จักซึ่งเป็นรุ่น BSD ที่ดูแลโดยmirabilosจะขยายสิ่งนี้ไปยังสวิตช์ CLI ที่สามารถเข้าถึงได้โดยตรง

ตัวอย่างเช่นหากต้องการคัดลอกเฉพาะไฟล์ทั้งหมดในทรีที่./ถูกแก้ไขครั้งล่าสุดก่อนccyymmddHHMMที่/target/dirคุณจะทำได้:

pax -rwT,201301010000 ./ /target/dir

เพื่อหลีกเลี่ยงการเรียกซ้ำไปยังไดเร็กทอรีย่อยคุณอาจทำแทน:

pax -rwdT,201301010000 ./* /target/dir

ดูmanหน้ามากขึ้น


ฉันเดาว่าฉันควรจะเรียนรู้จริงๆpaxแต่tarและcpioยังคงยืนหยัดได้ดี +1
roaima

@roaima - พูดอย่างเคร่งครัดในขณะที่มีpaxรูปแบบการเก็บถาวรจริง(ซึ่งเป็นส่วนขยายของรูปแบบustar ) pax ยูทิลิตี้ POSIX-spec'd จะอ่าน / เขียนรูปแบบ cpio, pax และ ustar เนื่องจากทั้งสามประเภทเก็บถาวรเป็นหลักเพียงวิธีการที่แตกต่างกันในการเข้ารหัสข้อมูลเมตาสำหรับไฟล์จำนวนมากควบคู่ไปกับข้อมูลจริงของไฟล์ดังกล่าวลงในสตรีมเดียวจึงไม่ยืดมากนัก ฉันเคยเขียนshitar- ซึ่งเป็นเพียงไม่กี่บรรทัดของเชลล์สคริปต์สำหรับ - ส่วนใหญ่dd- tarไอเอ็นจีบล็อก devs ในทันทีตาม POSIX spec
mikeserv

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