ย้ายช่วงของไฟล์ที่มีหมายเลขหรือไม่


14

ฉันมีไฟล์หมายเลข 291 ไฟล์ (เริ่มต้นที่ 001 - ชื่อและลงท้ายด้วย 291 - ชื่อเรื่อง) ที่ต้องการย้ายไปยังไดเรกทอรีอื่น (001 ถึง 021 ไปยังโฟลเดอร์ 1, 022 ถึง 053 ไปยังโฟลเดอร์ 2 พวกเขาไม่จำเป็นต้องมีจำนวนไฟล์เท่ากันในแต่ละครั้ง)

ฉันคิดว่าฉันสามารถทำได้ในลักษณะที่โชคดีเช่นนี้: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

ฉันเกือบจะเป็นบวกมีวิธีที่ดีกว่าแล้วมันจะเป็นอะไร?

แก้ไข: ดังนั้นที่จะทำงานได้ดี แต่ฉันจำได้ ...

ฉันไม่ได้ติดขัดด้วยเทอร์มินัลดังนั้นฉันจึงใช้ตัวจัดการไฟล์เพื่อคลิกและลาก คำถามยังคงยืนอยู่


1
คุณต้องการ 21 โฟลเดอร์ย่อยในโฟลเดอร์ 1 และ 22 โฟลเดอร์ในโฟลเดอร์ 2 หรือไม่
Daniel Beck

คุณตรวจสอบ unix.SE แล้วหรือยัง มีหัวข้อที่ดีเกี่ยวกับเรื่องนี้ที่นี่: unix.stackexchange.com/questions/12976/…
chrisjlee

@Daniel ไม่ต้องฉันต้องการย้ายไฟล์ไปยังแต่ละโฟลเดอร์ แต่ละไฟล์มีจำนวนไฟล์แตกต่างกันไป
Rob

@ ChrisJ.Lee มันค่อนข้างคล้ายกับสิ่งที่ฉันทำ / เคยทำมาก่อนฉันชอบ เนื่องจากไฟล์ตรงกับไฟล์อื่นในโฟลเดอร์อื่นฉันจึงสามารถls -l | grep ^- | wc -lรับจำนวนบรรทัดได้
Rob

1
@Rob Right ยังคงจำนวนไฟล์ที่แตกต่างกันในแต่ละไดเรกทอรี โดยอัตโนมัติว่า (รวมถึงกฎ) เป็นความพยายามมากกว่าการทำด้วยตัวเองสองสามครั้ง
Daniel Beck

คำตอบ:


25

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

mv filename{001..21} dir1
mv filename{022..53} dir2
...

ดูเหมือนว่ามันจะใช้ได้ฉันจะลองดู
Rob

1
มันจะทำงานได้อย่างสมบูรณ์ถ้าคุณเพิ่มไวด์การ์ดหลังวงเล็บ นี่คือสิ่งที่ฉันต้องการ
Rob

2
หากหมายเลขอยู่ตรงกลางของชื่อคุณสามารถเขียนfile{001..21}nameคุณไม่จำเป็นต้องใช้สัญลักษณ์แทน อย่างไรก็ตามมีความสุขที่ได้ผลกับคุณ
drrlvn

1

สิ่งนี้จะย้ายไฟล์ตามที่คุณอธิบาย (ยกเว้นช่วงที่สองจะเป็น 022 ถึง 042 สำหรับ 21 ไฟล์ที่สอง)

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

มันไม่ใช่ไฟล์ 21 ไฟล์เสมอไป แต่ขอบคุณ
Rob

0

สิ่งที่ฉันหมายถึงคือการย้ายไฟล์จำนวนมาก (เช่นหมื่นหรือล้าน) เชลล์จะบ่นเกี่ยวกับรายชื่อไฟล์นานเกินไปถ้าคุณใช้ {1..20} ดังนั้น

ในzshคุณสามารถโหลดmv builtin ได้:

setopt Extended_glob zmodload

zsh / ไฟล์

หลังจากทำเช่นนั้นคุณสามารถใช้คำสั่งเช่น:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

หรือถ้าคุณกำลังเขียนเชลล์สคริปต์คุณสามารถทำสิ่งนี้:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

หากคุณไม่ได้ใช้ zsh คุณสามารถดูที่/unix/128559/solving-mv-argument-list-too-long


แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงนั้นเปลี่ยนแปลง คำตอบใดที่คุณอ้างถึงว่าเป็น "คำตอบที่ละเอียดยิ่งขึ้น"
Ramhound

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