Bash ส่วนย่อยเพื่อย้ายไฟล์ทั้งหมดในไดเรกทอรีไปยังไดเรกทอรีนั้น


14

ฉันมีไดเรกทอรีที่มีไฟล์และไดเรกทอรีจำนวนมากอยู่ในนั้น เพื่อเป็นระเบียบเรียบร้อยฉันจะใส่ไฟล์เหล่านั้นลงในไดเรกทอรีดังนั้นฉันจะทำสิ่งนี้:

$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory

แต่ที่เห็นได้ชัดว่าจะไม่ทำงานเพราะก็จะพยายามที่จะย้ายเข้ามาnew_directory new_directoryมีวิธีง่ายๆในการทำสิ่งที่ฉันต้องการในหนึ่งบรรทัดโดยไม่ต้องคัดลอกและวางไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรีนั้นหรือไม่?


3
ใช้งานได้เพียงพิมพ์ข้อความแสดงข้อผิดพลาดที่ไม่สามารถย้าย new_directory ไปยังตัวเองได้
cas

คำตอบ:


18

ของคุณ

mv * ./new_directory
คำสั่งจะใช้งานได้จริง มันจะพิมพ์คำเตือนว่าไม่สามารถย้ายไดเรกทอรีนั้นไปยังตัวเองได้


ปัญหา 'เท่านั้น' ในกรณีนี้คือถ้าการขยายทั้งหมดของคำสั่งยาวเกินไป (เช่นไฟล์มากเกินไปชื่อยาวเกินไป) สิ่งนี้จะไม่ทำงานอีกต่อไป
Niels Basjes

ในฐานะที่เป็นบันทึกด้านข้างหากคุณจะทำเช่นนี้กับ a git mvคุณต้องใช้การ-kตั้งค่าสถานะเนื่องจาก git จะล้มเหลวโดยค่าเริ่มต้นไม่ใช่แค่คายคำเตือน git mv -k * ./new_dirดังนั้นคุณจะต้องทำ
Yuval A

11

ผู้เผยแพร่ทางอินเทอร์เน็ตที่รวดเร็วและสกปรก

mv `ls -A | grep -v new_directory` ./new_directory

1
จะไม่ทำงาน: ls ธรรมดาจะไม่แสดง dotfiles
wzzrd

จุดที่ดีมาก แก้ไขว่าด้วย -a

2
ดังนั้นแทนที่จะพยายาม mv new_directory กับตัวเอง (คำถามเดิม) ตอนนี้คุณกำลังพยายามย้าย และ .. ใน new_directory
Niels Basjes

2
ขอบคุณสำหรับข้อเสนอแนะ Niels แก้ไขด้วยส่วนบนที่เอาออก และ .. จากรายการไดเรกทอรี

8

หากคุณกำลังมองหาไฟล์ (เช่นไม่ใช่ไดเรกทอรี)

find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;

เป็นทางออกที่พกพาได้มากที่สุด สำหรับความเร็วคุณควรเลื่อน find และ xargs ด้วย -print0 และ -0 แต่เฉพาะในกรณีที่คุณมี GNU find และ xargs


3
เมื่อใช้ GNU find ล่าสุดคุณสามารถใช้ \ + แทน \; เพื่อลดจำนวนของ mv ที่เราทำ
wzzrd

หากคุณพบ GNU คุณก็สามารถใช้ xargs ได้ซึ่งจะทำเช่นเดียวกันและให้คุณเรียกใช้ mv หลายรายการพร้อมกันด้วยแฟล็ก -p
Cian

การใช้งานที่ยอดเยี่ยมfind- แม้ว่าฉันเคยใช้ระบบที่ไม่มีระบบมาแล้ว แต่น่าเสียดาย :(
warren

จริงๆ? find is (afaik) ที่ระบุใน SUS ดังนั้นทุกอย่างควรมี ปัญหาเดียวคือไม่ว่าจะเป็น GNU find (ซึ่งมีตัวเลือกเด็ด ๆ มากมาย) หรือ find find ปกติ
Cian

อ๋อมันดูเหมือนจะเป็นopengroup.org/onlinepubs/009695399/utilities/find.html
ตาแดง

6

เวลาที่ฉันมีปัญหานี้ฉันทำอย่างใดอย่างหนึ่งต่อไปนี้:

$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .

หรือ

$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory

รูปแบบที่สองใช้ประโยชน์จากการข้ามชื่อไฟล์ที่เริ่มต้นด้วย '.'


ฉันลืมไฟล์ wild-card ที่ข้ามไป ขอบคุณสำหรับการเตือน! :)
aemonge

2

เกี่ยวกับ:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

IOW อย่าย้ายเนื้อหาไปยังไดเรกทอรีใหม่ แต่ให้วางไดเรกทอรีนี้ไว้ในไดเรกทอรีใหม่


1

ในทำนองเดียวกันกับคำตอบของ@ Rembrane (แต่ไม่ใช่สายการบินเดียว):

for FN in *
do
    if [ "<new_dir>" != $FN ] then
        mv $FN <new_dir>
done

สิ่งนี้ควรพกพาได้ 100% แม้ว่าfindจะหายไปจากระบบของคุณ


find เป็นสิ่งจำเป็นในยูนิกซ์สเปคเดียว เช่นนี้มันไม่ควรจะขาด (ไม่ได้ว่าคุณไม่สามารถสร้างสิ่งที่มีออกมามัน แต่ฉันคิดว่ามันจะต้องมีจำนวนที่น่ากลัวของความพยายามและระบบผู้ขายจะไม่ขาดมัน.)
ตาแดง

บางทีมันอาจจะมีระบบไฮสปีดหวาดระแวง yoinking findutils หรือสิ่งที่เทียบเท่า? ไม่แน่ใจ แต่ผมรู้ว่าผมเคยทำงานเป็น boxen ที่ไม่ได้มีมัน :(
วอร์เรน

1

คำแนะนำของฉัน: ตามที่ระบุโดยคนอื่น ๆ

mv * ./new_directory

จะทำงานหา IFF การขยายตัวโดยรวมนั้นสั้นพอ

ฉลาดอื่น ๆ คุณสามารถลองอันนี้ที่ปรับให้ใหญ่กว่าจำนวนไฟล์มากขึ้น:

find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory

คำอธิบาย

  1. รายการไฟล์ทั้งหมด
  2. จัดกลุ่มชื่อไฟล์ทั้งหมดเป็นกลุ่มไม่เกิน 100000 ตัวอักษร
  3. สร้างคำสั่ง mv เดียวต่อหนึ่งอัน

แบ่งถ้าคุณได้มีช่องว่างใด ๆ ในชื่อไฟล์ของคุณ
ตาแดง

คุณถูก. ดังนั้นฉันเดาว่านี่ควรเพิ่มด้วย -print0 และ -0 เพื่อแก้ไข
Niels Basjes

ฉันลอง-print0แล้ว-0และมันก็ยังหยุดพัก
Cristian Ciupitu

ค้นหา: คำเตือน: คุณได้ระบุตัวเลือก -maxdepth หลังจากอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือก -type แต่ตัวเลือกไม่ได้ตำแหน่ง (-maxdepth ส่งผลกระทบต่อการทดสอบที่ระบุไว้ก่อนหน้านี้เช่นเดียวกับที่ระบุหลังจากนั้น) โปรดระบุตัวเลือกก่อนอาร์กิวเมนต์อื่น
Cristian Ciupitu

1

ใช้:

find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \
    xargs -0 -P 100 -I'{}' mv '{}' new_directory

จากxargsหน้าคน:

-P max-procs

  Run up to max-procs processes at a time;

-1

เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดและทำให้มันง่าย:

mv *.* ./new_Folder

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

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