วิธีการย้ายไฟล์ทั้งหมดในโฟลเดอร์ปัจจุบันไปยังโฟลเดอร์ย่อย?


70

ฉันอยู่ที่เส้นทาง:

/myuser/downloads/

และฉันสร้างโฟลเดอร์ย่อย:

/myuser/downloads/new

ตอนนี้ฉันต้องการย้ายไฟล์และโฟลเดอร์ / โฟลเดอร์ย่อยทั้งหมดในโฟลเดอร์ดาวน์โหลดไปยังโฟลเดอร์ย่อย

ฉันจะทำสิ่งนี้ได้อย่างไร

ฉันเหนื่อย:

mv -R *.* new/

แต่การเคลื่อนไหวไม่ได้ใช้สวิตช์ -R


4
คุณไม่ต้องการ -R เพียงmv * newแต่มันจะสะอื้น "ไม่สามารถย้ายใหม่ใหม่" หรือสิ่งที่คล้ายกัน บางทีmv -i * newคุณอาจจะป้องกันการเขียนทับ

คำตอบ:


101

คำสั่ง

mv !(new) new

ควรทำเคล็ดลับ หากไม่ได้ผลให้เรียกใช้shopt -s extglobก่อน

หากต้องการย้ายไฟล์ / ไดเรกทอรีที่ซ่อนอยู่ (ที่ขึ้นต้นด้วยจุด) ให้รันshopt -s dotglobก่อน
ดังนั้นเพื่อสรุป:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(เป็นการดีกว่าเสมอที่จะยกเลิกการตั้งค่าdotglobเพื่อหลีกเลี่ยงความประหลาดใจที่ไม่ดี)


5
คุณพูดถึงความสำคัญของ!(something)อะไรได้บ้าง?
Adeerlike

2
@adeer ที่เพิ่งพูดไม่ได้ (บางสิ่ง) กล่าวอีกนัยหนึ่งให้คัดลอกทุกอย่าง แต่ไม่ใช่ทุกอย่าง ชัดเจนเหมือนโคลนไหม
RockyMountainHigh

4
มาก. คุณรู้วิธีที่เทียบเท่ากับ zsh หรือไม่
Adeerlike

1
ฉันไม่เข้าใจเช่นถ้าฉันพยายามย้ายเนื้อหาของโฟลเดอร์devไปยังตำแหน่งปัจจุบันของฉันฉันต้องดำเนินการหรือmv !(dev) devไม่? ฉันได้รับ-bash: !: event not found
Black

5
@adeer คล้ายกันมาก setopt extendedglobเพื่อตั้งโหมด glob แบบขยายใน zsh ^เป็นสัญลักษณ์การยกเว้นดังนั้นmv ^new newจะทำเคล็ดลับ จากนั้นเพื่อดูตัวเลือกทั้งหมดที่ตั้งค่าใน zsh คุณสามารถใช้setoptและปิดการใช้งานโหมด glob แบบขยายที่คุณสามารถทำได้unsetopt extendedglob
Mr. T

10

ฉันพบสิ่งนี้ แต่เข้าใจง่ายขึ้นเล็กน้อยและมันก็ใช้ได้ดีสำหรับคุณเช่นกัน:

ls | grep -v new | xargs mv -t new

การเพิ่มคำอธิบายให้กับโซลูชันด้านบน:

จากหน้าคน:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

อธิบายโดยขั้นตอน:

  • ls จะแสดงรายการไฟล์ในไดเรกทอรีปัจจุบัน
  • grep -v new จะส่งคืน piped ไปยังที่ไม่ตรงกับใหม่
  • xargs mv -t newจะย้ายไฟล์ที่ถูกปิเปตไปgrep -vยังไดเรกทอรีเป้าหมาย

ฉันลองใช้วิธีนี้ แต่ได้รับ: mv: illegal option -- t. นี่เป็นเพราะฉันใช้zshหรือไม่
ConstantFun

@ConstantFun มันอาจเป็น zsh แต่ฉันคิดว่ามันเป็นการใช้งานของmvคุณ (หมายถึงเวอร์ชัน mv ของคุณแตกต่างจากที่ฉันใช้) คุณใช้ระบบปฏิบัติการอะไร ผมเชื่อว่าเมื่อผมเขียนคำตอบนี้ผมอยู่บนลินุกซ์ distro ใช้centos bash
lockwobr

2
เพียงแค่ทดสอบบน osx และฉันได้รับข้อผิดพลาดเดียวกันmv: illegal option -- tซึ่งเป็นเพราะ mv ของ osx ไม่มี-tตัวเลือก
lockwobr

1
(ฉันไม่ได้ลองสิ่งนี้และไม่ได้วางแผนไว้) ลิงค์นี้apple.stackexchange.com/questions/69223/…จะบอกวิธีติดตั้ง gnucore ซึ่งจะช่วยให้คุณได้รับ gnu core cli utos osx มาพร้อมกับ bsd เครื่องมือ cli ที่แตกต่างจากที่มากับ linux
lockwobr

ฉันใช้ OSX อยู่zshดังนั้นจึงน่าจะเป็นระบบปฏิบัติการแล้ว .. ? ขอบคุณสำหรับการชี้แจง!
ConstantFun

7

ความคิดง่ายๆ สมมติว่าคุณอยู่ใน/ myuserเปลี่ยนชื่อการดาวน์โหลดเป็นใหม่สร้างไดเรกทอรีดาวน์โหลดใหม่จากนั้นย้ายใหม่เข้าไป

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

หากคุณต้องการย้ายไฟล์ทั้งหมดจากโฟลเดอร์ไปยังหนึ่งในโฟลเดอร์ย่อยคุณสามารถใช้คำสั่งต่อไปนี้:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

มันจะค้นหาไฟล์ทั้งหมดแล้วย้ายไปยังโฟลเดอร์ย่อยของคุณ

@waltinator: เพิ่มเพื่อป้องกันการสำรวจเส้นทางของ-type d -name 'new' -prune/myuser/downloads/new


ฉันสร้างไดเรกทอรีย่อยชื่อnewแล้วลองคำสั่งนี้ฉันจะได้รับmv: missing file operandและTry 'mv --help' for more information
mook765

1

คุณสามารถลองกระบวนการทางเลือกนี้ - - อยู่ในเส้นทาง

/myuser/downloads/

แต่แทนที่จะแรกสร้าง/myuser/downloads/new/ไดเรกทอรีแทนที่จะสร้างโฟลเดอร์ใน/myuser/ไดเรกทอรีที่มีคำสั่งmkdir ../newแล้วย้ายไฟล์ทั้งหมดในdownloadsการnewและในที่สุดก็ย้ายเข้ามาnew downloadsคุณสามารถทำได้ในหนึ่งบรรทัดขณะที่อยู่ใน/myuser/downloads/พา ธ ด้วยคำสั่ง:

mkdir ../new && mv * ../new && mv ../new ../downloads

ในกรณีนี้คุณไม่ต้องกังวลเกี่ยวกับ "การกรอง" ของไฟล์ / โฟลเดอร์ใด ๆ เนื่องจากnewอยู่ในระดับเดียวกับพา ธdownloadsดังนั้นคุณสามารถย้ายทุกอย่างdownloadsเข้าไปได้newแล้วย้ายnewไปดาวน์โหลด

อย่างไรก็ตามหากคุณnewสร้างโฟลเดอร์ย่อยแล้วและไม่ต้องการสร้างโฟลเดอร์ใหม่อีกไม่ต้องกังวล - เพียงแค่เปลี่ยนmkdirคำสั่งทางด้านซ้ายมือของรายการแรก&&ในคำสั่งที่แสดงด้านบนเป็นmvคำสั่งผลักnewขึ้นใน เส้นทาง; ในคำอื่น ๆ ในขณะที่คุณยังอยู่ใน/myuser/downloads/คุณสามารถเปลี่ยนไปmkdir ../new mv new ..จากนั้นโฟลเดอร์ย่อยnew[ในพา ธ/myuser/downloads/new/] จะถูกผลักไป/myuser/new/ที่ระดับเดียวกัน/myuser/downloads/และจากนั้นคุณสามารถเรียกใช้ส่วนที่เหลือของคำสั่งตามที่แสดงด้านบน ทั้งหมดเข้าด้วยกันเราได้เริ่มต้นจากเส้นทาง/myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

และเนื่องจากคุณต้องการ "ย้ายไฟล์และโฟลเดอร์ / โฟลเดอร์ย่อยทั้งหมดในโฟลเดอร์ดาวน์โหลดไปยังโฟลเดอร์ย่อย [ new]" คุณก็ทำเสร็จแล้ว! ถ้าคุณอยากที่จะย้ายเพียงไฟล์ (หรือเพียงโฟลเดอร์หรือ [แทรกการเคลื่อนไหวของวัตถุที่ละเอียดมากขึ้น]) แล้วคุณจะต้องใช้คำสั่งอื่น ๆ ที่สามารถ "กรอง" grepวัตถุเช่น อย่างไรก็ตามคำสั่งที่เขียนไว้ด้านบนนั้นเพียงพอสำหรับวัตถุประสงค์ของคุณ

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