ฉันจะบังคับพา ธ ที่สัมพันธ์กันในเอาต์พุต“ find” ได้อย่างไร


25

ฉันพยายามสร้างสคริปต์ที่สามารถบีบอัดไฟล์ที่มีนามสกุลบางอย่างในไดเรกทอรีจำนวนหนึ่งให้กลายเป็น tar-ball เดียว ปัจจุบันสิ่งที่ฉันมีในไฟล์สคริปต์คือ:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

ในกรณีที่$rootDirเป็นเส้นทางหลักในการค้นหา

นี่เป็นสิ่งที่ดียกเว้นพา ธ นั้นสมบูรณ์ในไฟล์ tar $rootDirฉันชอบเส้นทางที่จะเทียบกับ ฉันจะทำสิ่งนี้อย่างไร

ตัวอย่างของกระแสtar -tf docs.tarที่$rootDirเป็น/home/username/testเอาท์พุท:

home/username/test/subdir/test.doc
home/username/test/second.doc

สิ่งที่ฉันต้องการผลลัพธ์ที่จะเป็น:

./subdir/test.doc
./second.doc

คำตอบ:


12

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

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

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

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

แทน.

โปรดทราบว่า pushd / popd ไม่มีอยู่ในเชลล์ทั้งหมดดังนั้นให้ตรวจสอบ man page ตามความเหมาะสม พวกเขาอยู่ในทุบตี แต่ไม่อยู่ในการดำเนินการตามฐานดังนั้นในขณะที่ใช้อย่างชัดเจน/bin/bashคุณสามารถพึ่งพาพวกเขาคุณไม่สามารถถ้าสคริปต์ขอ/bin/shแทน (เช่นนี้อาจแมปกับเปลือกขนาดเล็กที่ไม่มีการปรับปรุงทุบตี)


ขอบคุณ ทำงานเก่ง ไม่ทราบว่า linux มี pushd / popd
เชน

3
หรือเพียงแค่ใช้cd $rootDirและcd - (อย่างน้อยก็ในbash) ( cd $rootDir ; find ... )จะเป็นไปได้เช่นทำทุกอย่างใน subshell
Daniel Beck

9

คุณสามารถใช้%Pรูปแบบใน-printfคำสั่ง:

find ${rootDir} -name '*.doc' -printf "%P\n"

จะแสดงในตัวอย่างของคุณ:

subdir/test.doc
second.doc

จากนั้นคุณสามารถใช้findรายการนี้ในการforแสดงออกเพื่อเรียกใช้คำสั่ง exec ของเราเช่นเดียวกับใน:

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

1
วิธีการแก้ปัญหาที่ยอมรับใช้งานได้ แต่เป็นแฮ็ค IMHO สิ่งนี้ควรเป็นคำตอบที่ถูกต้องสำหรับคำถาม
Narcolessico

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