บันทึก PDF ทั้งหมดในไดเรกทอรีโดยเก็บโครงสร้างไดเรกทอรีไว้


11

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

ตัวอย่างเช่นสมมติว่าฉันมีไดเรกทอรีที่มีลักษณะเช่นนี้:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

หลังจากรันคำสั่งฉันต้องการมีdir.tar.gzสิ่งนี้:

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

ไปได้หรือไม่

คำตอบ:


10

นี่จะแสดงรายการ PDF ทั้งหมด:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

คุณสามารถไพพ์นั้นเพื่อxargsให้มันเป็นเส้นคั่นด้วยช่องว่างเดียวและฟีดนั้นtarเพื่อสร้างไฟล์เก็บถาวร:

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(วิธีนี้จะละเว้นไดเรกทอรีที่ว่างเปล่า)


1
มันยอดเยี่ยมมากขอบคุณสำหรับความช่วยเหลือ นี่คือสิ่งที่ฉันเกิดขึ้นกับ:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
อเล็กซานเดแมตต์

3
@mattalexx: ระวังว่าคำสั่งนี้จะไม่ทำงานหากชื่อไฟล์ใด ๆ มีช่องว่างหรือ\'"(ความผิดของ xargs) และจะไม่ทำงานหากมีชื่อไฟล์มากเกินไป (ความผิดของเคอร์เนล)
Gilles 'หยุดความชั่วร้าย'

2
@Gilles เกี่ยวกับชื่อไฟล์ที่มีช่องว่างและคำพูดเดี่ยว-printf '"%p"\n'ส่วนจะดูแลมัน (อย่างน้อยมันก็ทำให้ฉัน)
แมตต์อเล็กซานเด

1
@Gilles สนใจเกี่ยวกับข้อ จำกัด เคอร์เนล คุณสามารถมีอาร์กิวเมนต์กี่ตัวในคำสั่งใน Linux?
แมตต์อเล็กซานเด

5
โอ้ที่“จะไม่ทำงาน” ทราบว่าโหมดความล้มเหลวของที่นี่ก็คือว่าถ้าบรรทัดคำสั่งยาวเกินไป xargs จะแยกขึ้นเพื่อให้ภาวนาน้ำมันดินที่ผ่านมาจะเขียนทับไฟล์อย่างเงียบ ๆ ที่เขียนโดยสวดก่อนหน้านี้
Gilles 'ดังนั้นหยุดความชั่วร้าย'

6

ด้วย bash ≥4หรือ zsh และ GNU tar:

tar -czf dir.tar.gz dir/**/*.pdf

สิ่งนี้อาจไม่ทำงานหากคุณมีไฟล์ PDF จำนวนมากและบรรทัดคำสั่งยาวเกินไป จากนั้นคุณจะต้องใช้โซลูชันการค้นหาที่ซับซ้อนมากขึ้น (อีกครั้งโดยใช้ GNU tar):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

หรืออีกวิธีหนึ่ง (และ portably) คุณสามารถสร้างเก็บกับท่าน

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

คนแรก-sบอกว่าจะรวม.pdfไฟล์ทั้งหมดโดยไม่ต้องเปลี่ยนชื่อ ที่สอง-sบอกว่าจะเปลี่ยนชื่อไฟล์อื่น ๆ ทั้งหมดเป็นชื่อที่ว่างเปล่าซึ่งจริงๆแล้วหมายถึงไม่รวมไว้ในที่เก็บถาวร


โอ้ใช่ฉันหมายถึงการพูดถึงของ zsh **; ฉันไม่ได้ตระหนักถึงทุบตี 4 ว่าตอนนี้
Michael Mrozek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.