สร้างไฟล์และไดเรกทอรีหลัก


19

ฉันรู้ว่าtouchคำสั่งสร้างไฟล์:

touch test1.txt

แต่ฉันจะสร้างไฟล์และเส้นทางแบบเต็มได้อย่างไร?

เช่นเดสก์ท็อปของฉันไม่มีอะไร:

~/Desktop/$ ls
~/Desktop/$

และฉันต้องการสร้าง 1.txt ~/Desktop/a/b/c/d/e/f/g/h/1.txtค่ะ ฉันสามารถทำได้ด้วยคำสั่งง่ายๆเช่น:

$ touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

แทนที่จะสร้างเส้นทางแบบเต็มด้วยตนเองแล้วสร้างไฟล์?

คำตอบ:


23

touchไม่สามารถสร้างไดเรกทอรีได้คุณต้องการmkdirสิ่งนั้น

อย่างไรก็ตามmkdirมีประโยชน์-p/ --parentsตัวเลือกที่สร้างโครงสร้างไดเรกทอรีแบบเต็ม

จากman mkdir:

   -p, --parents
          no error if existing, make parent directories as needed

ดังนั้นคำสั่งที่คุณต้องการในสถานการณ์เฉพาะของคุณคือ:

mkdir -p ~/Desktop/a/b/c/d/e/f/g/h/ && touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

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

  • ฟังก์ชั่น Bash (ต่อท้ายบรรทัดนี้เพื่อ~/.bashrcให้ผู้ใช้ของคุณสามารถใช้งานได้ไม่เช่นนั้นจะหายไปอีกเมื่อคุณออกจากเครื่อง):

    touch2() { mkdir -p "$(dirname "$1")" && touch "$1" ; }
    

    มันสามารถใช้แบบนี้:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Bash script (เก็บไว้ในการ/usr/local/bin/touch2ใช้ sudo เพื่อให้พร้อมใช้งานสำหรับผู้ใช้ทุกคนและ~/bin/touch2สำหรับผู้ใช้ของคุณเท่านั้น):

    #!/bin/bash
    mkdir -p "$(dirname "$1")" &&
        touch "$1"
    

    อย่าลืมที่จะทำให้สคริปต์ใช้งานchmod +x /PATH/TO/touch2ได้

    หลังจากนั้นคุณสามารถเรียกใช้ดังนี้:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    

ฉันสามารถแก้ไขtouch คำสั่งดั้งเดิมและเพิ่มสวิตช์-pไปได้หรือไม่
MA Heshmat Khah

3
@HeshmatKhah มันควรจะเป็นไปได้ แต่ไม่แนะนำให้ใช้เงาระบบปฏิบัติการด้วยสคริปต์หรือฟังก์ชั่นของคุณเอง คุณสามารถใช้ชื่อtouch-p(ไม่มีช่องว่าง!) แทนtouch2หากคุณต้องการ "p" แต่ฉันจะไม่พยายามแทนที่คำสั่งเดิม
ผู้บัญชาการ Byte

1
โปรดทราบว่าคุณสามารถใช้การลบคำต่อท้ายแทนdirnameเช่นคุณสามารถทำได้เช่นmkdir -p "${1%/}" && touch "$1"เดียวกับaskubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy

7

หนึ่งสามารถใช้installคำสั่งด้วยการ-Dตั้งค่าสถานะ

bash-4.3$ install -D /dev/null mydir/one/two

bash-4.3$ tree mydir
mydir
└── one
    └── two

1 directory, 1 file
bash-4.3$ 

หากเรามีหลายไฟล์เราอาจต้องการพิจารณาใช้รายการ (หมายเหตุอย่าลืมอ้างอิงรายการด้วยช่องว่าง) และวนซ้ำไฟล์:

bash-4.3$ for i in mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} ; do 
> install -D /dev/null "$i"
> done
bash-4.3$ tree mydir
mydir
├── one
│   └── two
├── subdir 2
│   ├── file3
│   └── file4
└── subdir one
    ├── file1
    └── file2

หรืออีกทางเลือกหนึ่งด้วยอาเรย์:

bash-4.3$ arr=( mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} )
bash-4.3$ for i in "${arr[@]}"; do  install -D /dev/null "$i"; done
bash-4.3$ tree mydir
mydir
├── one
│   └── two
├── subdir 2
│   ├── file3
│   └── file4
└── subdir one
    ├── file1
    └── file2

ด้วยวิธีนี้ไฟล์ใหม่จะได้รับการอนุญาตให้ใช้งานได้ตามค่าเริ่มต้น ที่จะให้มันสิทธิ์ที่เหมือนกันก็จะได้รับด้วยการสัมผัสหนึ่งสามารถใช้install -m 644 -D /dev/null <filepath>
ricab

1

เพื่อจุดประสงค์นี้คุณสามารถสร้างฟังก์ชั่นของคุณเองตัวอย่างด้านล่าง:

$ echo 'mkfile() { mkdir -p "$(dirname "$1")" && touch "$1" ;  }' >> ~/.bashrc
$ source ~/.bashrc
$ mkfile ./fldr1/fldr2/file.txt

ก่อนอื่นเราจะแทรกฟังก์ชั่นที่ส่วนท้ายของไฟล์ ~ / .bashrc โดยใช้คำสั่ง echo ฟังก์ชั่นธง -p ช่วยให้การสร้างโฟลเดอร์ที่ซ้อนกันเช่น fldr2 จากตัวอย่างของเรา ในที่สุดเราก็อัพเดตไฟล์ด้วยคำสั่ง source และในที่สุดก็รันคำสั่ง mkfile ที่สร้างขึ้นเมื่อเร็ว ๆ นี้

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