ฉันจะใช้เทอร์มินัล Linux เพื่อคัดลอกทุกสิ่งในไดเรกทอรีปัจจุบันไปยังไดเรกทอรีย่อยได้อย่างไร
ฉันจะใช้เทอร์มินัล Linux เพื่อคัดลอกทุกสิ่งในไดเรกทอรีปัจจุบันไปยังไดเรกทอรีย่อยได้อย่างไร
คำตอบ:
หากคุณต้องการคัดลอกเนื้อหาของโฟลเดอร์ซ้ำ (จะโยน 1 ข้อผิดพลาดทางเลือกด้านล่าง):
cp -r * sub/
แฮ็คเพิ่มอีกเล็กน้อย แต่ทำงานในไดเรกทอรีย่อยที่ไม่ว่าง:
TARGETDIR='targetdir here';cp -r `find . -maxdepth 1 ! -name "$TARGETDIR"` "$TARGETDIR"
ตัวเลือกอื่น:
TARGETDIR='targetdir here';for file in *;do test "$file" != "$TARGETDIR" && cp "$file" "$TARGETDIR/";done
หรือเรียกซ้ำ:
TARGETDIR='z';for file in *;do test "$file" != "$TARGETDIR" && cp -r "$file" "$TARGETDIR/";done
findรหัส: D
xargs -execไม่จำเป็นต้องgrepใช้! -name "$TARGETDIR"หรือคล้ายกัน $fileคุณมีคำพูดที่ไม่ตรงกันรอบ ๆ ฉันไม่คิดว่า recursive cpจะทำงานตามที่คุณตั้งใจ แต่อย่างใด
สมมติว่าtargetเป็นชื่อของไดเรกทอรีย่อยเป้าหมายหากเชลล์ของคุณเป็นทุบตี:
shopt -s extglob
cp -r !(target) target/
ใน ksh cp -r !(target) target/คุณโดยตรงสามารถทำ
ใน zsh คุณสามารถทำได้แล้วsetopt ksh_glob cp -r !(target) target/เป็นไปได้ก็คือแล้วsetopt extended_globcp -r ^target target/
ฉันขอแนะนำให้ย้ายไดเรกทอรีเป้าหมายนอกไดเรกทอรีต้นทางแล้วนำกลับมาอีกครั้ง mv ไม่มีค่าใช้จ่าย (ถ้าคุณระมัดระวังที่จะไม่ย้ายไปยังระบบไฟล์อื่น) เว้นแต่ว่าคุณคาดว่ากระบวนการอื่นจะรบกวน / แทรกแซง
โซลูชันส่วนใหญ่ที่โพสต์ด้านบนจะไม่ทำงานหากมีช่องว่างในชื่อไฟล์ ฉันอยากจะแนะนำให้ใช้ตัวแปรของ find -print0 | xargs -0 หรือค้นหา -exec เป็นต้น
จะใช้งานได้สำหรับคุณหรือไม่
cp -r * subdir/
หากคุณต้องการย้ายแทนที่จะคัดลอกทุกสิ่งใน dir ปัจจุบันไปยังไดเรกทอรีย่อยคุณสามารถทำได้:
mv * subdir/
สิ่งนี้จะคัดลอกทุกอย่างรวมถึงไฟล์ dot และไม่รวมไดเรกทอรีเป้าหมายไปยังไดเรกทอรีเป้าหมายSUBDIR:
for i in `ls -a | grep -Ev '^(SUBDIR|\.\.?)$'`; do cp $i SUBDIR; done
นี้ไปในไฟล์พูด dirCopy.sh
for i in `ls`
do
if [ $i != "subDir" ]
then
`cp -r $i subDir`
fi
done
เรียกใช้เป็น "sh dirCopy.sh" ในคอนโซลของคุณ
ls for file in *ไม่จำเป็นต้อง backticks - $()การใช้งาน ไม่จำเป็นต้องมี backticks (หรือ$()) รอบcpคำสั่ง (ที่จะสร้างข้อความแสดงข้อผิดพลาด)