ทุบตีค้นหารายการไฟล์ที่เก็บถาวรด้วย wildcard ในขณะวนซ้ำ


2

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

นี่เป็นความคิดเริ่มต้นของฉันLISTคือรายการไฟล์ PARENTDIRเป็นไดเร็กทอรีระดับบนซึ่งไฟล์ทั้งหมดอยู่ในไดเร็กทอรีย่อยต่างๆ แนวคิดก็คือการค้นหาจดหมายเหตุทั้งหมดในไดเรกทอรีย่อยใด ๆ ที่พวกเขาเป็นและ gunzip พวกเขาไปNEWDIR

#!/usr/bin/env bash    

LIST="listfile.txt"
PARENTDIR="/home/user/old/project"
NEWDIR="/home/user/old/project/2016"

while read line;
do
    ARCHIVE="$(find $PARENTDIR -name "$line*")"
    gunzip --stdout $ARCHIVE >$NEWDIR/$line
done <$LIST

ฉันดูเหมือนจะไม่ได้รับคำสั่ง find มันทำงานได้โดยไม่ต้องใช้ตัวแปร แต่ไม่ใช่กับแม้จะไม่มีการทดแทนคำสั่งเรียกใช้บรรทัดคำสั่ง การรวมราคาและบัตรเสริมของฉันไม่ถูกต้อง แต่ฉันไม่สามารถทำให้ถูกต้องการขยายตัวที่หลากหลายไม่ได้ช่วยอะไรและฉันคิดว่าฉันติดอยู่ ...


เพิ่มecho "$ARCHIVE"เพื่อดูว่าเกิดอะไรขึ้น ... หรือset +ก่อนและset - หลังส่วนที่จะทำการดีบัก หากมีช่องว่างที่คุณต้องการใช้" $variable"... จะเกิดอะไรขึ้นหากพบว่ามีการเก็บถาวรที่สอดคล้องกับคีย์มากกว่าหนึ่งรายการ ดีกว่าfind... -exec gzip {} ;
Hastur

ขอบคุณสำหรับข้อเสนอแนะecho "$ARCHIVE"แสดงผลบรรทัดว่างecho $lineแสดงสิ่งที่ฉันคาดหวัง ฉันรวมset +แล้วset -แต่ดูเหมือนจะไม่มีอะไรเกิดขึ้นเช่นกัน - แต่ฉันไม่คุ้นเคยกับฉากนี้อย่างแน่นอน
Carambakaracho

@Hastur คุณพูดถูกการทดสอบของฉันแสดงว่าฉันมีรายการซ้ำกันสองสามพันรายการ แต่ไม่ใช่ทั้งหมด โดยหลักการแล้วไฟล์ข้อความแรกสามารถเขียนทับได้ในวินาทีโดยจะ find... -exec gzip {} ;ขยายขนาดไฟล์เก็บถาวรสองเท่าหรือไม่
Carambakaracho

คำตอบ:


1

ฉันคิดว่าใช้-execตัวเลือกสำหรับfindแต่สิ่งนี้จะไม่ทำงานเนื่องจากตัวดำเนินการเปลี่ยนเส้นทางที่ใช้กับgunzipคำสั่ง ทางออกหนึ่งคือการดำเนินการในสองขั้นตอน:

1. คัดลอกไฟล์เก็บถาวรลงใน$NEWDIR:

    while read line
    do
        find "$PARENTDIR" -name "$line*" -exec cp -v {} "$NEWDIR" \;
    done < "$LIST"

สิ่งนี้น่าจะใช้ได้กับรุ่นที่รองรับ POSIXfindไม่เพียง แต่ GNU เท่านั้น

หลีกเลี่ยงการเขียนไฟล์ที่มีชื่อคล้ายกันมากเกินไป

หากคุณมีชื่อไฟล์ซ้ำพวกเขาจะถูกเขียนทับ$NEWDIRมากเกินไป หากคุณต้องการหลีกเลี่ยงการเขียนทับไฟล์มากเกินไปคุณต้องสร้างแผนผังไดเรกทอรี$NEWDIRใหม่อีกครั้ง ซึ่งสามารถทำได้โดยใช้installคำสั่งจากcoreutils GNUซึ่งจะสร้างทุกmkdir -pชิ้นส่วนของเส้นทางที่คล้ายกับ

    cd "$NEWDIR"
    while read line
    do
        find . -name "$line*" -exec install -D {} $NEWDIR/{} \;
    done < "$LIST"
    cd -

2. ขยายไฟล์ที่คัดลอก:

    find "$NEWDIR" -exec gunzip {} \;

ขอบคุณวิธีแก้ปัญหาที่เกิดขึ้นจริงกับปัญหาเริ่มแรกคือการเปลี่ยนไดเรกทอรี แต่ฉันจะไม่ลองเลยหากไม่มีคำแนะนำของคุณ ฉันเรียกใช้งานสคริปต์จากภายใน$NEWDIRและคิดว่าสิ่งนี้ควรให้เส้นทางที่แน่นอน เมื่อย้ายไป$PARENTDIRหางานที่ฉันไม่เข้าใจจริงๆ ฉันใช้-exec cpคำสั่งเพราะแน่นอนว่าฉันสร้างรายการที่ซ้ำกันแล้ว
Carambakaracho

1
ขอบคุณสำหรับinstallคำสั่งฉันไม่รู้จักอันนี้! ในกรณีนี้ฉันสามารถยอมรับการเขียนทับมันไม่สำคัญ แต่ฉันจะจำinstallคำสั่งไว้ใช้ในอนาคต
Carambakaracho

@Carambakaracho $PARENTDIRฉันพยายามที่จะสร้างการติดตั้งในระบบของฉันและฉันก็ไม่จำเป็นต้องเปลี่ยนไดเรกทอรีไป หากไม่มีการดีบั๊กข้อมูลมันยากที่จะบอกว่าทำไมคุณต้องทำ BTW ฉันได้แก้ไขคำตอบของฉันเพื่อรวมวิธีหลีกเลี่ยงการเขียนไฟล์ที่มีชื่อคล้ายกันมากเกินไป
Anthony Geoghegan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.