วิธีย้ายไฟล์ x ไฟล์แรก


21

ฉันมีโฟลเดอร์ใหญ่นี้ที่มีไฟล์เรียงลำดับหลายพันไฟล์ เป็นไปได้ไหมที่จะย้าย 5000s แรกไปยังโฟลเดอร์ย่อยผ่านmvคำสั่ง? ตอนนี้ฉันย้ายไฟล์ด้วย

 mv *some_pattern* ./subfolder1/

สำหรับตอนนี้ฉันย้ายภาพไปมาโดยการสุ่มมันไม่สำคัญจริงๆถ้ามีไฟล์ไม่ถึง 5,000 ไฟล์ในแต่ละโฟลเดอร์ย่อย มีวิธีที่ดีกว่าที่จะทำหรือไม่


คำตอบ:


23
mv `ls | head -500` ./subfolder1/

12
(สมมติว่าไม่มีชื่อไฟล์ใดที่มีช่องว่าง, แท็บ, ขึ้นบรรทัดใหม่, ดาว, วงเล็บเหลี่ยมเปิด, เครื่องหมายคำถามหรือเริ่มต้นด้วย-หรือ.และสมมติว่าsubfolder1ตัวเองไม่ปรากฏในรายการนั้น)
Stéphane Chazelas

@ StéphaneChazelasหากไฟล์มีสิ่งเหล่านั้นเราจะแก้ไขคำสั่งได้อย่างไร
Peiti Li

$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
Brian Thomas

15

ด้วยzsh:

mv -- *(D.oN[1,5000]) ./subfolder1

หากต้องการย้ายไฟล์ปกติสูงสุด 5,000 ไฟล์ตามลำดับที่อยู่ในไดเรกทอรี

สำหรับ 5,000 รายการแรกในรายการเรียงตามพจนานุกรม:

mv -- *(D.[1,5000]) ./subfolder1

ถ้าคุณได้รับข้อผิดพลาดเกี่ยวกับรายการหาเรื่องนานเกินไป คุณสามารถใช้คำสั่งzshbuitin mvโดยการออก:

zmodload zsh/files

เป็นครั้งแรก

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/

2
ตัวอย่าง POSIX เป็นอัญมณี
iruvar

เกิดอะไรขึ้นถ้าฉันได้รับข้อผิดพลาดโดยใช้ bash?
Brian Thomas

8

รุ่นที่เรียบง่ายและรองรับตัวอักษรพิเศษช่องว่าง ฯลฯ

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

สำหรับการทำงานตามที่เป็นdir2จะต้องมีอยู่และคุณจะต้องดำเนินการได้จากไดเรกทอรีแม่ของและdir1dir2

จะย้ายไฟล์ 1,000 ไฟล์จาก dir1 ไปยัง dir2


ทำได้ดีนี่! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ สำหรับการย้าย 1,000 ไฟล์ที่ใหญ่ที่สุดใน dir1 (-S แสดงไฟล์ตามขนาด)
oneklc

1
โปรดทราบว่าls -Qไม่สร้างผลลัพธ์ที่เข้ากันได้กับxargsรูปแบบอินพุตที่คาดหวัง ช่วยสำหรับชื่อไฟล์ที่มีอักขระเว้นวรรค แต่ไม่ใช่สำหรับเครื่องหมายคำพูดคู่หรือแบ็กสแลชและเป็นอันตรายต่อชื่อไฟล์ที่มีอักขระควบคุมรวมถึง TAB
Stéphane Chazelas

3

คุณอาจต้องทำสิ่งนี้:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

สคริปต์นี้ใช้งานได้กับ bash, ksh, sh และ UNIX หลายรุ่น


1
(หากไม่มีชื่อไฟล์ที่มีช่องว่าง, แท็บ, การขึ้นบรรทัดใหม่, ดาว, วงเล็บเหลี่ยมแบบเปิด, เครื่องหมายคำถามหรือขึ้นต้นด้วย - หรือ. และหากdestinationตัวเองไม่ปรากฏในรายการนั้น)
Stéphane Chazelas

@StephaneChazelas True นี่ไม่ใช่วิธีการแก้ปัญหาที่สมบูรณ์เพียงวิธีการจัดการกับปัญหา
Karlson

3
  1. ไปที่ไดเรกทอรีที่คุณต้องการย้ายไฟล์
  2. เรียกใช้คำสั่งด้านล่าง

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

ในfindคำสั่ง.(จุด) หมายถึงไดเรกทอรีปัจจุบัน

ค้นหาไฟล์ที่ขึ้นต้นด้วย Hello และลงท้ายด้วย gz ไฟล์แรก 5,000 ไฟล์จะถูกย้ายไปที่พา ธ /data01/path/


1

ฉันสามารถย้าย 50,000 สำเร็จโดยไม่มีข้อผิดพลาดทุบตี mv เช่นนี้

 ls | head -50000 | xargs -I{} sudo mv {} 01/

ตลกดีนี่เป็นแชร์ของ samba ดังนั้นขีด จำกัด 50k เป็นเพราะ Windows Explorer GUI ไม่ชอบไฟล์มากกว่า 60k ใน dir โดยทั่วไป

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