Score:0

สร้างโฟลเดอร์ย่อยและย้ายไฟล์

ธง id

ฉันมีโฟลเดอร์ชื่อ p/ และใน p/ ฉันมีโฟลเดอร์ย่อยหลายโฟลเดอร์ดังนี้:

$[~/p] ล
ก/ ข/ ค/

a/ b/ และ c/ ยังมีโฟลเดอร์ย่อยหลายโฟลเดอร์อีกด้วย ฉันพยายามค้นหาไฟล์ที่ตรงกับรูปแบบเฉพาะในแต่ละโฟลเดอร์และโฟลเดอร์ย่อยของ p/ และย้ายไฟล์เหล่านี้ไปยังไดเร็กทอรีใหม่ในโฟลเดอร์ a/, b/ และ c/ ที่สอดคล้องกัน ดังนั้น a/ จะมีโฟลเดอร์ย่อยใหม่ชื่อ x/ และใน x/ จะถูกย้ายไฟล์ที่ตรงกันทั้งหมดที่พบใน a/, b/ จะมีโฟลเดอร์ย่อยใหม่ชื่อ x/ และลงใน x/ จะถูกย้ายไฟล์ที่ตรงกันทั้งหมดที่พบ ใน b/ และอื่น ๆ

ฉันเหนื่อย:

pth=เส้นทาง/ถึง/หน้า

สำหรับ dir ใน ${pth}/*; ทำ 
    mkdir -- "$dir/x";
    หา . -ชื่อ '*match*' -exec mv -t ./x '{}' +;
เสร็จแล้ว

อย่างไรก็ตาม มันใช้งานไม่ได้ มันทำให้ x/ โฟลเดอร์ย่อยเป็น a/, b/ และ c/ แต่มันไม่ขยับอะไรเลย

ฉันได้:

mv: ไม่สามารถเข้าถึง './x': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว

ฉันทำอะไรผิด?? คุณช่วยฉันหน่อยได้ไหม

muru avatar
us flag
คุณใช้ `mkdir -- "$dir/x"` แต่คุณใช้ `./x` ในคำสั่ง `mv`
bac0n avatar
cn flag
คุณไม่ควรใช้เป้าหมายภายในจุดเริ่มต้น *find's* เพราะอาจสร้างสภาวะการแย่งชิงหรืออย่างน้อยก็ยกเว้นเป้าหมาย
Score:0
ธง cn

ฉันแนะนำให้ทำทีละขั้นตอนโดยสร้างไดเร็กทอรีก่อน จากนั้น ค้นหาและจัดระเบียบผลการค้นหา เนื่องจากเป้าหมายของคุณอยู่ในการค้นหา คุณต้องตัดเป้าหมาย มิฉะนั้นอาจนำไปสู่สภาพการแข่งขัน ตอนนี้ เราสามารถดำเนินการได้ครั้งละหนึ่งรายการ แต่เนื่องจากใช้ทรัพยากรจำนวนมาก โดยปกติจะเป็นการดีกว่าหากจัดระเบียบการค้นหาของคุณก่อนที่จะย้ายเป็น เอ็มวี รับเพียงเป้าหมายเดียวเท่านั้น จำกัดจำนวนไฟล์ที่เราสามารถย้ายได้ในเวลาเดียวกัน ในกรณีนี้ เราสามารถจัดระเบียบการค้นหาด้วยอาร์เรย์ที่เชื่อมโยงโดยที่คีย์กลายเป็นเป้าหมาย ไฟล์จะถูกกำหนดเป็นสตริง สิ่งสำคัญคือต้องอ้างอิงอักขระพิเศษภายในชื่อไฟล์ มิฉะนั้น ช่องว่างจะถูกตีความว่าเป็นการแบ่งคำ (หรือแบ่งด้วยวิธีอื่น)

#!/bin/bash

ซีดีในตัว p
พิมพ์f %s/x\0 {a,b,c} | xargs -0 mkdir -p

ประกาศ -A =()
ในขณะที่ IFS=/ read -rd '' bc; ทำ
    ก[${b@Q}/x]+=\ "${b@Q}/${c@Q}"
เสร็จสิ้น < <(ค้นหา -type d -path './*/x' -prune -false -o -type f -name '*.txt' -printf %P\0)

สำหรับ k ใน "${!a[@]}"; ทำ
    eval printf '%s\0' "$k" "${a[$k]}" | xargs -0 mv --backup=t -t
เสร็จแล้ว
Al_Mt avatar
id flag
ขออภัย ฉันยังใหม่กับเทอร์มินัล และฉันไม่เข้าใจสิ่งที่คุณกำลังทำอยู่ ฉันพยายามเรียกใช้สิ่งที่คุณแนะนำ และสร้างโฟลเดอร์ a,b,c (หากไม่มีอยู่) และโฟลเดอร์ย่อย x ภายใน แต่ก็ไม่ได้เคลื่อนไหวอะไร นอกจากนี้ ฉันไม่ทราบชื่อของ a/, b/ และ c/ เสมอไป และฉันมีโฟลเดอร์หลายร้อยโฟลเดอร์ใน p/ ดังนั้นในกรณีนี้จะเปลี่ยนแปลงได้อย่างไร

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา