วิธีการย้ายไฟล์ทั้งหมดจากไดเรกทอรีปัจจุบันไปยังไดเรกทอรีบนใน linux?
ฉันลองอะไรที่ชอบmv *.*
แต่ก็ไม่ได้ผล
วิธีการย้ายไฟล์ทั้งหมดจากไดเรกทอรีปัจจุบันไปยังไดเรกทอรีบนใน linux?
ฉันลองอะไรที่ชอบmv *.*
แต่ก็ไม่ได้ผล
คำตอบ:
คำสั่งที่คุณกำลังมองหาคือ
mv * .[^.]* ..
หรือ (ดูข้อมูลเพิ่มเติมด้านล่าง):
(shopt -s dotglob; mv -- * ..)
คำอธิบาย: mv
คำสั่งย้ายไฟล์และไดเร็กทอรี อาร์กิวเมนต์สุดท้ายที่mv
เป็นเป้าหมาย (ในกรณีนี้คือไดเรกทอรีหนึ่งขั้นตอน "up" ในแผนผัง, ..
) ข้อโต้แย้งก่อนหน้านั้นคือไฟล์ต้นฉบับและไดเรกทอรี เครื่องหมายดอกจัน ( *
) เป็นสัญลักษณ์แทนซึ่งตรงกับไฟล์ทั้งหมดที่ไม่ได้ขึ้นต้นด้วยจุด ไฟล์ที่ขึ้นต้นด้วย dot (dotfiles) คือ "hidden" พวกเขาจับคู่โดยใช้รูปแบบ.[^.]*
(ดูการแก้ไขด้านล่าง)
ดู manpage mv
ที่ฉันเชื่อมโยงสำหรับข้อมูลเพิ่มเติมเกี่ยวกับ
.[^.]*
แทน.*
?ขณะที่คริสจอห์นสันได้อย่างถูกต้องชี้ให้เห็น: รูปแบบ.*
นอกจากนี้ยังตรงและ.
..
เนื่องจากคุณไม่ต้องการที่จะ (และไม่สามารถ) ย้ายเหล่านั้นดีกว่าที่จะใช้รูปแบบที่ตรงกับชื่อไฟล์ใด ๆ ที่เริ่มต้นด้วยจุดที่ยกเว้นที่สอง รูปแบบ.[^.]*
ทำเช่นนั้น: มันตรงกับชื่อไฟล์ใด ๆ (1) ที่ขึ้นต้นด้วยจุด (2) ตามด้วยตัวละครที่ไม่ใช่จุด (3) ตามด้วยอักขระศูนย์หรือมากกว่านั้น
เมื่อPaggas ชี้ให้เห็นเราจำเป็นต้องเพิ่มรูปแบบ.??*
เพื่อให้ตรงกับไฟล์ที่ขึ้นต้นด้วยสองจุด find
ดูคำตอบของเขาเพื่อแก้ปัญหาทางเลือกใช้
คำตอบของ Arjan กล่าวถึงshopt
เพื่อหลีกเลี่ยงปัญหาทั้งหมดที่มีกับ dotfiles แต่ก็ยังมีปัญหากับไฟล์ที่เริ่มต้นด้วยเส้นประ และมันต้องใช้สามคำสั่ง ยังฉันชอบความคิด ฉันเสนอที่จะใช้มันเช่นนี้
(shopt -s dotglob; mv -- * ..)
นี้ดำเนินการshopt
ใน subshell (จึงไม่มีสายที่สองจะshopt
ต้องมี) และใช้เพื่อให้ไฟล์ที่เริ่มต้นด้วยเส้นประจะไม่ถูกตีความว่าเป็นข้อโต้แย้ง--
mv
.*
อาจก่อให้เกิดmvการผลิตคำเตือน / ข้อผิดพลาดเกี่ยวกับการที่จะไม่สามารถที่จะย้ายและ.
..
คุณอาจลองmv * .[^.]* ..
แทน
*
, และ.[^.]*
..?*
อาจเป็นครั้งที่สอง .[!.]*
สำหรับเชลล์ (POSIX) รุ่นเก่า อ่านเพิ่มเติม
คำตอบสั้น ๆ : ใช้
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
คำตอบยาว:
คำสั่ง
mv * .* ..
จะไม่ทำงานเนื่องจาก.*
สามารถจับคู่และ.
..
แต่คำสั่ง
mv * .[^.]* ..
จะไม่ทำงานเนื่องจาก.[^.]*
จะไม่ตรงกันเช่น..filename
! แต่สิ่งที่ฉันทำคือ
mv * .[^.] .??* ..
ซึ่งจะตรงกับทุกอย่างยกเว้นและ.
จะตรงกับทุกอย่างที่ไม่ได้เริ่มต้นด้วย, จะตรงกับชื่อไฟล์ทั้งหมด 2 ตัวละครเริ่มต้นด้วยจุดยกเว้นและจะตรงกับชื่อไฟล์ทั้งหมดที่เริ่มต้นด้วยจุดที่มีอย่างน้อย 3 ตัวอักษร..
*
.
.[^.]
..
.??*
ดีกว่าคุณสามารถใช้
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
ซึ่งหลีกเลี่ยง glob hacks น่าเกลียดในmv * .[^.] .??* ..
!
..?*
ความคิดเห็นของฉันและคุณได้รับการดูแลแล้ว
mv
ให้หยุดมองหาตัวเลือกคำสั่งเพิ่มเติม วงเล็บปีกกาเป็นชื่อไฟล์ที่เกิดขึ้น เครื่องหมายบวกบอกว่าแทนที่จะเรียกใช้ exec ต่อผลลัพธ์ (เช่น. ต่อชื่อไฟล์) ใส่ผลลัพธ์มากที่สุดในการประมวลผลเดียวเท่าที่จะทำได้ เพื่อความสมบูรณ์-t..
บอกให้ย้ายปลายทางเป้าหมายเพื่อย้ายไฟล์เหล่านี้ทั้งหมดไปที่
เพียงเพื่อประโยชน์ของความสมบูรณ์หนึ่งสามารถบอก Bash shell ให้รวมไฟล์ที่ซ่อนอยู่โดยใช้shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
mv ไม่มีฟังก์ชั่นในการย้ายไฟล์ที่ซ่อนอยู่เมื่อใช้งาน*
- ทำไมคุณไม่ใช้ copy แทนล่ะ?
cp -rf . ..
rm -rf *
ไม่จำเป็นต้องเข้าสู่โซลูชันที่ซับซ้อนของ dotglobbing และใช้คำสั่ง find
rsync -a --remove-source-files . ..
rsync
เป็นเครื่องมือคัดลอกไฟล์ที่มีประสิทธิภาพอย่างมากโดยทั่วไปใช้สำหรับการสำรองข้อมูลระยะไกลและมิเรอร์ที่มีประสิทธิภาพ
ด้วยคำสั่งข้างต้นเรากำลังบอกrsync
ให้คัดลอกเนื้อหาของ.
ลงใน..
สวิตช์เปิด-a
ใช้งานการเรียกซ้ำไปยัง.
ไดเรกทอรีย่อยและเปิดใช้งานตัวเลือกทั่วไปอื่น ๆ
สวิตช์--remove-source-files
บอก rsync ให้ลบไฟล์ต้นฉบับหลังจากทำสำเนาสำเร็จนั่นคือทำให้ rsync ทำงานคล้ายกับmv
คำสั่ง
--remove-source-files
จะไม่ลบไดเรกทอรี (ทำข้อมูลให้ตรงกัน)
-bash: /bin/mv: Argument list too long
ข้อผิดพลาด อันนี้ใช้งานได้อย่างมีเสน่ห์
ในที่สุดความพยายามmv .
จะล้มเหลวเนื่องจาก mv ไม่สามารถยกเลิกการเชื่อมโยงไดเรกทอรีที่คุณอยู่ในปัจจุบันคุณสามารถmv * ..
ย้ายไฟล์ใน cwd ได้
mv * .??* ../.
*
รับไฟล์ที่ไม่ใช่จุดทั้งหมด .??*
ได้รับทั้งหมด ไฟล์อย่างน้อยสามไบต์ซึ่งใช้ได้กับไฟล์ที่ถูกต้องทั้งหมด สิ่งใดที่เหลือคุณอาจต้องการrm
มากกว่าmv
อยู่แล้ว
สิ่ง../.
นี้ไม่ได้ให้ประโยชน์โดยตรงเลย..
แต่เมื่อทำการย้ายไปยังไดเร็กตอรี่มันเป็นนิสัยที่ดีมากที่จะเข้าไปเพราะมันจะล้มเหลวอย่างที่คุณต้องการหากมีบางอย่างผิดปกติกับเส้นทาง ยกตัวอย่างเช่นmv xyz bletch
ที่คุณคิดว่า เป็นไดเรกทอรีสามารถทำบางอย่างมากขึ้นด้วยbletch
mv xyz bletch/.
.[^.]
.a
คำสั่งที่ย่อเล็กสุดนี้ทำงานบนเชลล์ที่ทันสมัยที่สุด:
\mv -- {,.{[^.],??}}* ..
อย่างอื่นที่กล่าวถึงเป็นวิธีแก้ปัญหาแบบพกพา:
\mv -- * .[^.] .??* ..
คุณสมบัติ:
\ ป้องกันนามแฝงจากการแก้ไข mv อย่างที่ไม่ต้องการ
- ป้องกันชื่อไฟล์ที่มีเครื่องหมายขีดคั่น (-xyz) นำหน้าจากการตีความเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
. [^.] จับคู่ชื่อไฟล์ทั้งสองตัวที่ขึ้นต้นด้วย ยกเว้น ..
. ?? * ตรงกับชื่อไฟล์อื่น ๆ ทั้งหมดสามตัวละครหรือนานกว่า
การใช้งานไร้เดียงสา:
ต่อไปนี้ข้ามชื่อไฟล์ UNIX ที่ซ่อนอยู่ซึ่งเริ่มต้นด้วย (.bashrc)
mv * ..
การจับคู่ต่อไปนี้ .. ซึ่งจะพยายามย้ายทุก ๆ ไดเรกทอรีในที่สุดตลอดทางกลับไปยัง / เข้าสู่ .. ของไดเรกทอรีการทำงานปัจจุบัน ($ PWD หรือ pwd) ห้ามใช้
mv .* ..
มันถูกต้องมากขึ้นในการใช้รูปแบบ* .[!.] .??*
มากกว่า* .[^.] .??*
เดิมที่จะใช้งานกับเชลล์รุ่นเก่าเช่น ksh88:
mv -- * .[!.] .??* ..
--
ป้องกันปัญหาเมื่อคุณมีชื่อไฟล์ที่ขึ้นต้นด้วย -
*
ตรงกับชื่อไฟล์ทั้งหมดที่ไม่ได้ขึ้นต้นด้วย .
.
ที่คุณสามารถ / ควรย้าย.[!.]
ตรงกับชื่อไฟล์อักขระทั้งสองซึ่งเริ่มต้นด้วย .
.??*
ตรงกับชื่อไฟล์อักขระทั้งสาม (หรือมากกว่า) ซึ่งเริ่มต้นด้วย .
ด้วย ksh88 รูปแบบชื่อไฟล์.[^.]
จะตรงกับชื่อไฟล์..
(ซึ่งมีอยู่เสมอ) และ.^
(ซึ่งอาจไม่มีอยู่) ซึ่งมีผลตรงข้ามกับสิ่งที่ต้องการ
ค้นหาและ grep ก็ทำงานเช่นกัน โครงสร้างชนิดนี้อาจมีประโยชน์หากคุณต้องการเลือกไฟล์ตามเกณฑ์ที่ซับซ้อนมากขึ้นโดยการแก้ไข find และ egrep
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
ฉันคิดว่าทางออกที่ง่ายที่สุดสำหรับการย้ายไฟล์ทั้งหมดไปยัง dir หลัก อยากจะเป็น
mv "`ls`" ../
หรือหากมีไฟล์ / ไดเรกทอรีที่ซ่อนอยู่
ใช้:
mv "`ls -a`" ../ 2>/dev/null
นอกจากนี้สมมติว่าคุณต้องการย้ายเนื้อหาของบางโฟลเดอร์ไปยังหนึ่งในโฟลเดอร์ภายใน (พูด)
ใช้:
mv "`ls -a`" /tony 2>/dev/null
บันทึก:
"`ls -a`"
หากต้องการย้ายไฟล์ที่มีช่องว่างอยู่
2>/dev/null
สำหรับระงับการเตือน / ข้อผิดพลาดเพราะls -a
จะพิมพ์.
และ..
โฟลเดอร์ด้วยและคุณไม่สามารถย้ายหรือคัดลอกได้ ดังนั้นสำหรับโฟลเดอร์เหล่านั้นมันจะแสดงข้อผิดพลาด (ถ้าเราไม่ใช้ 2> / dev / null) ว่ามันไม่สามารถย้ายมันได้และส่วนที่เหลือจะถูกย้ายอย่างสะดวกสบาย
ที่ดีที่สุดที่จะหลีกเลี่ยงถ้าไม่มีไฟล์ที่ซ่อนอยู่และการใช้งานเพียงแค่ls -a
ls
mv $(ls -a)
? แตะที่ไดเรกทอรีปัจจุบันและไดเรกทอรีด้านล่างเพราะls -a
จะแสดงผล..
เช่นกัน
mv ls -a ../
จะทำงานได้ตามต้องการใช่มันจะแสดงข้อผิดพลาดเหล่านั้นตามที่ฉันกล่าวถึงข้างต้น แต่นอกเหนือจากนั้นมันจะย้ายโฟลเดอร์ / ไฟล์ที่ต้องการไปยังพาเรนต์ dir
ls
คำสั่งสองครั้งเพื่อย้ายไฟล์ด้วยช่องว่าง ฉันได้ทำการเปลี่ยนแปลงที่จำเป็น ขอบคุณสำหรับการชี้ให้เห็น
[linux] [mv] [cwd] [files]
หรือสิ่งที่คล้ายกัน