ฉันจะรับ mv (หรือ * wildcard) เพื่อย้ายไฟล์ที่ซ่อนได้อย่างไร


133

ฉันกำลังย้ายไดเรกทอรีบ้านของฉันจากระบบเก่าไปยังใหม่และ tarball ที่ฉันทำมีทุกอย่างรวมถึงไฟล์ที่ซ่อนเช่น. bashrc อย่างไรก็ตามเมื่อฉันย้ายเนื้อหาของ tarball ที่ไม่ได้แพ็ค (ซึ่งอยู่ใน / tmp) ไปยังโฮมไดเร็กตอรี่ใหม่ของฉันไฟล์ที่ซ่อนจะไม่คัดลอก ( mv /tmp/home/rcook/* /home/rcook/) ฉันจะทำให้ mv ย้ายได้อย่างไร

อันที่จริงฉันคิดว่าปัญหาไม่ได้อยู่ที่ mv แต่มีปัญหาของการทุบตี ถ้าฉันทำสิ่งนี้:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

ฉันเห็นสิ่งนี้:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.fooไม่ได้ย้าย ดังนั้นฉันจะรับ * wildcard เพื่อค้นหาไฟล์ที่ซ่อนได้อย่างไร

ใช่ฉันคิดว่าฉันสามารถแตก tarball ลงในโฮมไดเร็กตอรี่ของฉันได้โดยตรง แต่ tarball นั้นแตกออกมาhome/rcook/...และฉันต้องการแน่ใจว่าฉันเขียนทับไฟล์ใหม่.bashrcและอื่น ๆ ด้วยเวอร์ชั่นเก่าที่ปรับแต่งแล้วและรู้วิธีค้นหาและย้ายไฟล์ที่ซ่อนอยู่ เป็นทักษะที่คุ้มค่า ข้อเสนอแนะ?


mv src/.* dest/คำตอบบางอย่างขอแนะนำให้ทำสิ่งที่ชอบ อย่างไรก็ตามฉันลองมันในไดเรกทอรีทดสอบและพบข้อผิดพลาด เริ่มต้นด้วย:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

ผมทำอะไรผิดหรือเปล่า?


คำตอบ:


146

คุณสามารถทำได้:

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

คุณสามารถใส่

shopt -s dotglob

ใน~/.bashrcถ้าคุณต้องการให้มันเป็นค่าเริ่มต้น

ดูhttp://mywiki.wooledge.org/glob


อีกวิธีในการคัดลอกไฟล์ dot:

mv /tmp/home/rcook/.[!.]* /home/rcook/

อย่าใช้รูปแบบ..*ที่ตรงกัน..(ตัวชี้ไปยังไดเรกทอรีหลัก) หากมีไฟล์ที่ชื่อขึ้นต้นด้วยสองจุด ( ..something) ให้ใช้รูปแบบ..?*เช่นกัน


โปรดตรวจสอบส่วนเพิ่มเติมที่ฉันใส่ไว้ที่ด้านล่างของคำถาม ขอบคุณ
Randall Cook

1
ไม่ผิด.และ..เป็นพิเศษ dirs: ตามลำดับdir & ผู้ปกครองปัจจุบัน มันเป็นเพียงคำเตือน shopt -s dotglobโซลูชันการใช้ที่ดีขึ้น
Gilles Quenot

ฉันสิ้นสุดเพียงแค่การทำสองย้าย: ตามมาด้วยmv home/rcook/* /home/rcook/ mv home/rcook/.* /home/rcook/นี่เป็นกลอุบายแม้ว่าฉันจะหวังว่าฉันจะได้ตามลิงก์และอ่านเกี่ยวกับโหมด dotglob ก่อน มันจะช่วยฉันทีละขั้น +1
Randall Cook

ดังนั้นวิธีที่สองต้องใช้เส้นทางที่แน่นอน?
franzlorenzon

3
หากคุณกำลังใช้zshคุณสามารถใช้คัดเลือก globbingหรือตัวเลือกเปลือก DGLOB_DOTS
mgalgs

43

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

mv src/* src/.* dst/

คุณจะยังคงได้รับข้อผิดพลาดสำหรับ และ .. รายการซึ่งเป็นเรื่องปกติ แต่การย้ายควรจะประสบความสำเร็จ

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move from/.’ to to/.’: Device or resource busy
mv: cannot remove from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

1
คะแนนที่ดี @AndrewSchwartz ฉันชอบวิธีนี้เช่นกัน ฉันคิดว่ามันสมควรได้รับการยอมรับมากขึ้น
Randall Cook

ฉันชอบ @Drake Clarris ตอบมากกว่านี้เพราะฉันทำงานบน Amazon AWS CodeBuild และรหัสส่งคืนที่ไม่ใช่ศูนย์ทำให้การสร้างของฉันหยุดลง ฉันลงเอยด้วยการย้าย.hiddenไฟล์เดียวที่ฉันมีเพื่อแก้ไขปัญหาของฉันอย่างชัดเจน
HeyWatchThis

หากรหัสทางออกที่ไม่เป็นศูนย์เป็นปัญหาคุณสามารถระงับได้เช่นโดยการต่อท้าย|| :( ||หมายถึงการดำเนินการต่อไปนี้เป็นเท็จ / ข้อผิดพลาด:คือคำสั่ง noop) แต่นั่นจะระงับข้อผิดพลาดที่ถูกต้องเช่นกันเช่นไม่มีโฟลเดอร์ปลายทาง ฉันไม่สามารถหาวิธีที่สวยงามกว่านี้ในmvการยกเว้น.และ..รายการ ก้นใหญ่บวกสำหรับฉันผ่าน cp ไม่ได้เขียนไฟล์ใหม่ลงดิสก์
Andrew Schwartz

10

หากคุณls -lอยู่ในไดเรกทอรีคุณจะเห็น.และ..อยู่ในรายการไฟล์ ดังนั้นฉันคิดว่าควรmv .* /destคำนึงถึงตัวชี้เหล่านั้นด้วย ลอง:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

สิ่งนี้จะละเว้นตัวชี้ dir ปัจจุบันและพาเรนต์เหล่านั้น

คุณจะได้รับข้อผิดพลาดถ้าใด ๆ ในสามรูปแบบ*, [^.]*หรือ..?*ตรงกับไฟล์ไม่ดังนั้นคุณควรจะรวมถึงคนที่ตรงกับ


ดี คำตอบที่คล้ายกันสำหรับรูปแบบของ globbing นี้อยู่ที่นี่: superuser.com/a/784046/144977 ขอขอบคุณที่โพสต์สิ่งนี้
phyatt

7

โซลูชันที่เป็นไปได้สองอย่างที่ฉันสามารถนึกได้ แรกคือการใช้ cp แทนด้วยตัวเลือกซ้ำของมันคัดลอกไดเรกทอรีปัจจุบันไปยังปลายทาง

cp -Rp . /desired/directory

จากนั้นคุณสามารถลบไฟล์ต้นฉบับในไดเรกทอรีปัจจุบัน

หรือถ้าคุณรู้ว่าไฟล์ถูกตั้งชื่ออย่างดี (ไม่มีช่องว่างสัญลักษณ์แทนอักขระที่ไม่สามารถพิมพ์ได้) คุณสามารถทำสิ่งนี้ได้

mv $(ls -A) /desired/directory

4
คัดลอกแล้วลบจะแตกต่างจากย้ายถ้าแหล่งที่มาและเป้าหมายอยู่ในระบบไฟล์เดียวกัน อย่างน้อยก็มีตัวเลือก-pในการรักษาข้อมูลเมตา การใช้lsควรเป็นทางเลือกสุดท้ายและที่นี่ก็มีวิธีที่ดีกว่าง่ายกว่า
Gilles

2

มันไม่มีอะไรที่เหมือนกับไฟล์ "ซ่อน" ใน Linux ไฟล์ที่ขึ้นต้นด้วยจุดจะถูกซ่อนจากรายชื่อไฟล์ตามค่าเริ่มต้น

ในการคัดลอกไฟล์แม้จะมี glob คุณต้องใส่คำนำหน้าไฟล์ด้วย.เช่นmv -u .* fooจากนั้น.fooจะปรากฏขึ้นfoo/.fooเมื่อย้าย

ตัวเลือก -u จะย้ายไฟล์เมื่อแหล่งที่มาใหม่หรือปลายทางหายไป หรือคุณก็อาจจะไม่สนใจข้อผิดพลาดเกี่ยวกับการย้าย.และการ..ที่พวกเขาเป็นไฟล์พิเศษและไม่สามารถย้ายได้ แต่ไม่ได้รับการติดใน.*glob โดยเปลือก


โปรดตรวจสอบส่วนเพิ่มเติมที่ฉันใส่ไว้ที่ด้านล่างของคำถาม ขอบคุณ
Randall Cook

0

ดังนั้นเราจึงมี:

a
|-- .foo
`-- bar

และ:

b

ฉันใช้เวลามากในการหาทางออกที่ดีกว่าคำตอบทั้งหมดที่นี่

จากนั้นฉันใช้เวลา30 วินาทีสำหรับคำสั่งนี้:

$ mv --help

จากนั้นฉันก็พบความรักของฉัน:

$ mv a/ b/ -T

หมายเหตุ: ฉันไม่เข้าใจ-Tด้วยซ้ำ มันทำในสิ่งที่ฉันต้องการ นี่มันพูดว่า:

-T, - ไม่มีไดเรกทอรีเป้าหมายถือว่า DEST เป็นไฟล์ปกติ


1
หากคุณเว้นเครื่องหมายทับคุณไม่จำเป็นต้อง-Tใช้ วิธีนี้เป็นการบอกให้ mv ย้ายไดเร็กทอรีเองแทนที่จะย้ายไฟล์ทั้งหมดจากด้านใน
thomasrutter

@thomasrutter ไม่ได้ย้ายไดเรกทอรีตัวเองเช่นเดียวกับการเปลี่ยนชื่อหรือไม่
Randall Cook

3
ใช่ถ้าปลายทางหลักยังคงเหมือนเดิมก็เป็นเพียงการเปลี่ยนชื่อ อย่างไรก็ตามคุณอ้างถึงมันอาจไม่ช่วยตอบคำถามเดิมซึ่งเกี่ยวกับการย้ายไฟล์ภายในไดเรกทอรีไปยังตำแหน่งที่กำหนด
thomasrutter

0

ในกรณีของฉันฉันเพียงแค่พยายามที่จะmvซ่อนไฟล์เดียวและนี่คือทางออก:

FILE=.myHiddenFile
mv "$FILE" dest/

คำอธิบาย

ตอนแรกฉันพยายาม:

mv .myHiddenFile dest/

แต่มันก็ทำให้เกิดข้อผิดพลาด:

mv: cannot stat '.myHiddenFile': No such file or directory

แม้ว่าจะls -alแสดงให้เห็นว่าไฟล์และdest/มีอยู่

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


-1

หากคุณต้องการคัดลอกไฟล์รวมถึงไฟล์ที่ซ่อนไปยังไดเรกทอรีปัจจุบันที่คุณอยู่

cp -Rp source-directory/. .

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