ฉันจะคัดลอกไฟล์ซ้ำโดยใช้นามสกุลไฟล์รักษาโครงสร้างของไดเรกทอรีได้อย่างไร


71

ที่บรรทัดรับคำสั่ง Linux ฉันต้องการคัดลอกชุดของ.txtไฟล์ที่มีขนาดใหญ่มากจากไดเรกทอรีหนึ่ง (และไดเรกทอรีย่อย) ไปยังอีกไดเรกทอรีหนึ่ง

ฉันต้องการโครงสร้างไดเรกทอรีเพื่อให้ยังคงเหมือนเดิมและฉันต้องการละเว้นไฟล์ยกเว้นไฟล์ที่ลงท้าย.txtด้วย


2
มี cp และค้นหาเป็นแท็กในคำถามของคุณหมายความว่าคุณเชื่อมโยงกับตัวเลือกเหล่านี้หรือไม่ เนื่องจากชุดข้อมูลของคุณมีขนาดใหญ่มากจึงควรถือว่ากระบวนการคัดลอกอาจถูกขัดจังหวะด้วยเหตุผลบางประการและคุณจะต้องเริ่มต้นใหม่ ฉันไม่แน่ใจว่าวิธี find / cp จะสามารถทำการถ่ายโอนต่อและคัดลอกเฉพาะส่วนที่ขาดหายไป หากคุณไม่ได้เชื่อมโยงกับ / cp คุณสามารถพิจารณา rsync ซึ่งฉลาดกว่า ตัวเลือก - ไม่รวมจะทำให้คุณข้ามไฟล์. txt
vtest

การโทรอย่างยุติธรรม - rsync อาจเป็นตัวเลือกที่ดีกว่า ไม่ต้องหา / cp (ฉันใช้พวกเขาต่อไป - rsync ไม่ได้ติดตั้งบนเครื่องระยะไกลมันเป็นเว็บเซิร์ฟเวอร์ที่มีชีวิต & ฉันต้องการที่จะปล่อยให้รอยเท้าเล็กที่สุดเท่าที่จะทำได้)
unclaimedbaggage

คำตอบ:


95

คุณสามารถใช้findและcpioเพื่อทำสิ่งนี้

cd /top/level/to/copy
find . -name '*.txt' | cpio -pdm /path/to/destdir

(-updm for overwrite destination content.)

ทำไม m ฉันคิดว่ามันเพียงเพื่อรักษาวันที่แก้ไขไฟล์
Mubashar

7
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;

คุณกำลังหายไปหลังจากที่. findนอกจากนี้ใน MacOS 10.13.1 นี้ทำงาน:find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
น่ากลัว

2

อีกแนวทางหนึ่ง

find . -name '*.txt' -exec rsync -R {} path/to/dext \;


ฉันชอบวิธีนี้ ฉันใช้find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;ในการจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์เล็กและเพื่อเป็นเจ้าของและสิทธิ์
MountainX

1

วิธีที่ง่ายที่สุดสำหรับฉัน:

cp --parents -R jobs/**/*.xml ./backup/

หนึ่ง catch คือคุณต้องไปที่ไดเรคทอรี "ที่ต้องการ" ก่อนเพื่อให้ "พา ธ พาเรนต์" ถูกต้อง

ตรวจสอบให้แน่ใจด้วยว่าคุณเปิดใช้งาน globs ซ้ำในทุบตี:

shopt -s globstar

1

ก่อนอื่นคุณต้องคัดลอกมันด้วย

cp -r /old/folder /new/folder

จากนั้นไปที่โฟลเดอร์ใหม่และเรียกใช้

find . -type f ! -iname "*.txt" -delete

หรือเพียงแค่

cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete

แก้ไข: ตกลงคุณต้องการหนึ่งคำสั่งที่ตัวกรอง (ฉันไม่ได้ทดสอบนี้เพราะระบบของฉันไม่มีcpioคำสั่ง!) ที่นี่ฉันพบมัน: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files

find . -name "*.txt" -print0 |
     cpio -pmd0 /dest-dir

โปรดทดสอบก่อนนี้เพราะฉันยังไม่ได้ลอง หากใครบางคนจะยืนยันว่าจะดี


พยักหน้าไชโย - วิธีนี้ใช้ได้ แต่ไม่มีการกรองเป็น. txt ฉันกำลังดูไฟล์สองสามล้านไฟล์ (กำลังออกมาสองสามร้อย GB) ถ้าจำเป็นฉันอาจต้องทำ แต่ฉันชอบกรองในขณะที่คัดลอกถ้าเป็นไปได้
unclaimed baggage

1
ไชโยรุ่นที่แก้ไขแล้วจะทำงานถ้าฉันลบ '0' ออกจาก -pmd0
unclaimedbaggage

คุณควรเก็บไว้0ใน-pmd0และเพิ่ม-print0ในตอนท้ายของfindคำสั่ง (ก่อนหน้า|)
G-Man

1

ฉันพยายามทำสิ่งเดียวกันบน macOS แต่ไม่มีตัวเลือกใดที่เหมาะกับฉันจริงๆ dittoจนกว่าฉันจะค้นพบ

ฉันต้องคัดลอกไฟล์. wav จำนวนมากและข้ามไฟล์วิดีโอ ... ดังนั้นนี่คือสิ่งที่ฉันได้รับ:

find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;

  • find .- รัน find ในโฟลเดอร์ปัจจุบัน ให้แน่ใจว่าคุณcd /source/folderก่อนที่จะเริ่ม

  • -type f - ระบุเพื่อค้นหาไฟล์เท่านั้น

  • -iname "*.wav" - สิ่งนี้บอกให้มองหาตัวพิมพ์เล็กและใหญ่ * .wav
  • -ls- สิ่งนี้แสดงไฟล์ที่ใช้งานอยู่ อย่างอื่นมันแสดงว่าไม่มีอะไร
  • -exec ditto {} /destination/folder/{} \; - ทำสำเนาและสร้างไฟล์ด้วยไดเรคทอรีเดียวกันหรือไม่

0

นำทางไปยังไดเรกทอรี:

find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination

มันจะตรงไปตรงมาและทรงพลังยิ่งขึ้นหากคุณจัดการกับนิพจน์ทั่วไป


-1

นำทางไปยังไดเรกทอรี:

cp '*.css' /path/to/destination

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


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