วิธีการย้ายไฟล์ทั้งหมด (รวมถึงซ่อน) ซ้ำในโฟลเดอร์ย่อยไปยังโฟลเดอร์หลักใน * ระวัง?


14

นี่เป็นคำถามที่น่าอายเล็กน้อย แต่ฉันต้องยอมรับว่าการมาสายนี้ในอาชีพของฉันยังคงมีคำถามเกี่ยวกับคำสั่ง mv

ฉันมีปัญหานี้บ่อย: ฉันต้องการย้ายไฟล์ทั้งหมดซ้ำ ๆ ในระดับหนึ่ง สมมติว่าฉันมีโฟลเดอร์ foo และแถบโฟลเดอร์อยู่ข้างใน บาร์มีไฟล์และโฟลเดอร์รวมถึงไฟล์และโฟลเดอร์แบบจุด ฉันจะย้ายทุกอย่างในบาร์ไปที่ระดับฟูได้อย่างไร

หาก foo ว่างเปล่าฉันเพียงเลื่อนแถบไปด้านบนหนึ่งระดับลบ foo และเปลี่ยนชื่อแถบเป็น foo ส่วนหนึ่งของปัญหาคือฉันไม่สามารถเข้าใจได้ว่าสัญลักษณ์ตัวแทนของ mv สำหรับ "ทุกอย่างรวมถึงจุด" คืออะไร ส่วนหนึ่งของคำถามนี้คือ - มีการสนทนาในเชิงลึกของสัญลักษณ์ตัวแทนที่คำสั่ง cp และ mv ใช้ที่ไหนสักแห่ง (googling สิ่งนี้นำบทเรียนแบบพื้นฐานมาใช้เท่านั้น)

คำตอบ:


19

ใน Bash (และอื่น ๆ ) คุณสามารถใช้การขยายรั้งเพื่อทำสิ่งนี้ให้สำเร็จในหนึ่งบรรทัด:

mv bar/{,.}* .

เครื่องหมายจุลภาคคั่นโมฆะและจุดดังนั้นmvคำสั่งจะเห็นชื่อไฟล์ที่ตรงกัน*และ.*


ความพยายามในการย้าย '.. ' เช่นนี้ล้มเหลวด้วยข้อความ 'ทรัพยากรไม่ว่าง' ทำงานได้อย่างไรก็ตาม
Xananax

3
แนะนำโดยผู้ใช้ที่ไม่ระบุชื่อ:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b

2

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือทำในสองคำสั่งเนื่องจาก * ไม่ตรงกัน

cd /foo
mv bar/* ./
mv bar/.??* ./

คุณไม่ต้องการใช้บาร์ /.* ที่ฉันพบขณะทำผิด:

rm -rf ./.* 

นี่คือสิ่งที่ไม่ดี ใคร ๆ ก็อยากเดาว่าทำไม ;-)


ฉันไม่คิดว่าทุบตีหรือ zsh ขยาย.*ไปและ. ..Zsh ไม่ได้สำหรับฉันอย่างน้อย
Mikael S

Mikael: ฉันสามารถสัญญาได้ว่าทุบตีจะทำ (หรืออย่างน้อยก็ทำ) ในขณะที่ฉันต้องกู้คืนไดเรกทอรีผู้ใช้ที่ฉันเช็ดออกด้วยการทำเช่นนั้น
Matt Simmons

2

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


2

อันนี้เก็บไฟล์ทั้งหมดจากโฟลเดอร์ย่อยและย้ายไปยังไฟล์ปัจจุบัน

find . -type f -exec mv -iv \{} . \;

หากคุณต้องการไฟล์ owerwrite ด้วยชื่อเดียวกันให้ใช้

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *จะดูแลทุกอย่างยกเว้นจุดตามด้วยตัวละครตัวเดียว .[a-zA-Z0-9]*หากเป็นเรื่องธรรมดาสำหรับสถานการณ์ของคุณคุณสามารถเพิ่ม ที่จะยังคงออกจากไฟล์ที่มีชื่อเช่น.;, .^และ.^I(แท็บ) หากคุณต้องการจัดการทุกสิ่งคุณจะต้องมีความซับซ้อนเพิ่มขึ้นเล็กน้อย

mv .. `ls -f | egrep -v '^.$|^..$'

0

หากคุณมีโครงสร้างไดเรกทอรี/foo/bar/และคุณต้องการย้ายไฟล์ทั้งหมดภายใต้barขั้นตอนเดียวให้ไปที่barไดเรกทอรีและพิมพ์ดังต่อไปนี้:

find . -depth -print0 | cpio --null -pvd ../

โดยทั่วไปฉันคิดว่าcpio(1)ดีกว่าสำหรับงานประเภทนี้ คุณสามารถตรวจสอบเอกสารรายละเอียดโดยการออกinfo cpioในเปลือกของคุณ

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