คุณจะย้าย (หรือคัดลอก) ไฟล์ทั้งหมดไปยังไดเรกทอรีที่มีคำนำหน้าชื่อไฟล์ได้อย่างไร


9

ใช้ Bash

ดังนั้นสมมติว่าฉันมีไฟล์หลายไฟล์วางอยู่ในไดเรกทอรีหลัก~/srcฉันต้องการคว้าไฟล์ทั้งหมดที่ตรงกับคำต่อท้ายและย้าย (หรือคัดลอก) ไปยัง~/distไดเรกทอรี

สมมติว่าเพื่อจุดประสงค์นี้ว่าชื่อไฟล์ทั้งหมดมีแบบแผนการตั้งชื่อนี้:

<filename_prefix>.<filename_suffix>

ฉันพบว่านี่เป็นวิธีที่รวดเร็วในการรับไฟล์ทั้งหมดโดยเฉพาะfilename_suffixและวางไว้ในโฟลเดอร์ dist:

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

ตอนนี้ขั้นตอนต่อไป ... ฉันจะใช้ผลลัพธ์การค้นหาในกรณีนี้filenameและใช้filename_prefixเพื่อสร้างไดเรกทอรีที่มีชื่อเดียวกัน~/distแล้วย้าย (หรือคัดลอก) ไฟล์ทั้งหมดที่มีคำนำหน้านั้นลงในไดเรกทอรีที่เหมาะสมได้อย่างไร

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

โดยพื้นฐานแล้วฉันจะเปลี่ยนคำสั่งด้านบนได้อย่างไร (หรืออาจใช้คำสั่งอื่น) เพื่อสร้างโครงสร้างเช่นนี้

(ขาออก)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

จากต้นไม้ไดเรกทอรีเช่นนี้?

(INPUT)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

คำตอบ:


10

มันจะเป็นนรกที่จะบอกfindว่าจะทำอย่างไรในกรณีนี้

ควรใช้เปลือก:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

ใช้shopt -s globstarเพื่อทำให้**glob ทำงาน (หรือใช้ zsh!) และลบechos ในภายหลังหากคำสั่งพิมพ์สิ่งที่คุณต้องการ


ใช้ bash นี้เหมือนกันหรือไม่
qodeninja

@codeninja shopt -s globstarดูการแก้ไขของฉัน หากมีเพียงสองระดับคุณสามารถใช้*/*.*และตัวอย่างจะทำงานในเปลือกใด ๆ
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

2

การโกงค้นหาบรรทัดคำสั่ง:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

อันที่จริงแล้วการหาสคริปต์ bash ใน find LOL

= P


1
คาดเดาสิ่งที่เกิดขึ้นหากมีไฟล์ที่เรียกว่า… happy rm -rf /! รหัสประเภทนี้สมควรได้รับ -1
Stéphane Gimenez

การแก้ไขของคุณไม่เพียงพอ: สมมติว่าคุณคลิกลิงค์แล้วดาวน์โหลดYay" rm -rf / "Rox0r.aviอีกครั้งมีปัญหา ...
Stéphane Gimenez

(และไม่มีทางที่จะทำให้การทดแทนนี้ปลอดภัย)
Stéphane Gimenez

1
อาอาจเป็นไปได้ที่จะทำสิ่งนี้แตกต่าง ดูเหมือนว่างานดังต่อไปนี้: -exec bash -c 'command which uses "$1"' bash '{}' ';'. มันค่อนข้างไร้จุดหมายอยู่ดี
Stéphane Gimenez

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