ฉันจะย้ายไฟล์ทั้งหมดยกเว้นหนึ่งไฟล์ได้อย่างไร ฉันกำลังมองหาบางสิ่งที่ชอบ:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
ที่ผมย้ายสิ่งเก่าที่จะ -folder Tux.png
สิ่งใหม่ยกเว้น ! -sign แสดงถึงการปฏิเสธ มีเครื่องมือสำหรับงานบ้างไหม?
ฉันจะย้ายไฟล์ทั้งหมดยกเว้นหนึ่งไฟล์ได้อย่างไร ฉันกำลังมองหาบางสิ่งที่ชอบ:
'mv ~/Linux/Old/!Tux.png ~/Linux/New/'
ที่ผมย้ายสิ่งเก่าที่จะ -folder Tux.png
สิ่งใหม่ยกเว้น ! -sign แสดงถึงการปฏิเสธ มีเครื่องมือสำหรับงานบ้างไหม?
คำตอบ:
หากคุณใช้ bash และมีการextglob
ตั้งค่าตัวเลือกของเชลล์
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
ใส่ต่อไปนี้เพื่อ. bashrc ของคุณ
shopt -s extglob
มันขยาย regexes จากนั้นคุณสามารถย้ายไฟล์ทั้งหมดยกเว้นหนึ่งไฟล์โดย
mv !(fileOne) ~/path/newFolder
โปรดทราบว่าในการคัดลอกไดเรกทอรีแฟลชไปข้างหน้าไม่สามารถใช้ในชื่อตามที่สังเกตเห็นในเธรดทำไมถึงมี extglob ยกเว้นการแตกยกเว้นเงื่อนไข? :
cp -r !(Backups.backupdb) /home/masi/Documents/
ดังนั้นBackups.backupdb/
ผิดที่นี่ก่อนการปฏิเสธและฉันจะไม่ใช้มันในการย้ายไดเรกทอรีเนื่องจากความเสี่ยงของการใช้ผิดแล้ว globs กับคำสั่งอื่น ๆ และข้อยกเว้นอื่น ๆ ที่เป็นไปได้
mv !(arc*) archive_190629b
ฉันจะไปกับวิธีการค้นหา & xargs แบบดั้งเดิม:
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 |
xargs -0 mv -t ~/Linux/New
-maxdepth 1
ทำให้ไม่ค้นหาซ้ำ หากคุณสนใจเฉพาะไฟล์คุณสามารถพูด-type f
ได้ -mindepth 1
ทำให้ไม่รวม~/Linux/Old
เส้นทางของตัวเองลงในผลลัพธ์ ทำงานร่วมกับชื่อไฟล์ใด ๆ รวมถึงที่มีการขึ้นบรรทัดใหม่
หนึ่งความคิดเห็นตั้งข้อสังเกตว่า-t
ตัวเลือกmv เป็นส่วนขยายของ GNU สำหรับระบบที่ไม่มี
find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
-exec mv '{}' ~/Linux/New \;
วิธีที่รวดเร็วคือการแก้ไขชื่อไฟล์ tux เพื่อให้คำสั่งย้ายของคุณไม่ตรงกัน
ตัวอย่างเช่น:
mv Tux.png .Tux.png
mv * ~/somefolder
mv .Tux.png Tux.png
ฉันคิดว่าวิธีที่ง่ายที่สุดที่จะทำคือกับ backticks
mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
แก้ไข:
ใช้เครื่องหมายแบ็กสแลชที่มี ls แทนเพื่อป้องกันการใช้กับนามแฝงนั่นคือ ls ส่วนใหญ่จะใช้นามแฝงเป็น ls --color
mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/
ขอบคุณ @Arnold Roa
grep -v
นั่น?
สำหรับ bash คำตอบของ sthนั้นถูกต้อง นี่คือไวยากรณ์zsh (เชลล์ที่ฉันเลือก):
mv ~/Linux/Old/^Tux.png ~/Linux/New/
ต้องการEXTENDED_GLOB
ตัวเลือกเชลล์ที่จะตั้งค่า
ฉันคิดว่านี่เป็นบิตที่ปลอดภัยและง่ายขึ้นสำหรับการย้ายแบบง่าย ๆ ที่ไม่รวมไฟล์หรือไดเรกทอรี
ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET
-l
ตัวเลือกในการls
จะรวมถึงข้อมูลจำนวนมากที่ไม่เกี่ยวข้องในบรรทัดคำสั่งและส่งผลให้เกิดความล้มเหลวของคำสั่ง mv
ต่อไปนี้ไม่ใช่วิธีการรับประกัน 100% และไม่ควรพยายามเขียนสคริปต์ แต่บางครั้งมันก็ดีพอสำหรับการใช้งานเชลล์แบบโต้ตอบได้อย่างรวดเร็ว ไฟล์ไฟล์ glob เหมือน
[abc]*
(ซึ่งจะจับคู่ไฟล์ทั้งหมดที่มีชื่อขึ้นต้นด้วย a, b หรือ c) สามารถคัดค้านได้โดยการใส่อักขระ "^" ก่อนเช่น
[^abc]*
บางครั้งฉันใช้สิ่งนี้เพื่อไม่จับคู่ไดเรกทอรี "lost + found" เช่น:
mv /mnt/usbdisk/[^l]* /home/user/stuff/.
แน่นอนถ้ามีไฟล์อื่น ๆ ที่ขึ้นต้นด้วย l ฉันต้องประมวลผลไฟล์เหล่านั้นในภายหลัง
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New
คำสั่ง find แสดงรายการไฟล์ปกติทั้งหมดและคำสั่ง fgrep จะกรอง Tux.png ใด ๆ backticks บอก mv เพื่อย้ายรายการไฟล์ผลลัพธ์
แล้วคุณย้ายทุกอย่างในโฟลเดอร์ไปได้อย่างไรแล้วแค่ย้าย Tux.png กลับมา?
ฉันไม่สามารถนึกถึงไวยากรณ์ของเชลล์ที่จะพูดว่า "ทุกอย่างยกเว้น ... " ได้ทันที
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/
ทำงานแทน
เกี่ยวกับ:
mv $(echo * | sed s:Tux.png::g) ~/Linux/New/
คุณต้องอยู่ในโฟลเดอร์แม้ว่า
ใครสามารถข้าม grepเช่นนี้:
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
นี่อาจง่ายกว่าและง่ายต่อการจดจำและใช้งานได้สำหรับฉัน
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination