ฉันจะใช้เทอร์มินัล 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_glob
cp -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
คำสั่ง (ที่จะสร้างข้อความแสดงข้อผิดพลาด)