Buat file dan direktori induknya

19

Saya tahu touchperintah itu membuat file:

touch test1.txt

tapi bagaimana saya bisa membuat file dan path lengkapnya?

misalnya desktop saya tidak mengandung apa pun:

~/Desktop/$ ls
~/Desktop/$

dan saya ingin membuat 1.txt di ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Bisakah saya melakukan ini dengan perintah sederhana seperti:

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

bukannya membuat path lengkap secara manual dan kemudian membuat file?

MA Heshmat Khah
sumber

Jawaban:

23

touchtidak dapat membuat direktori, Anda perlu mkdiruntuk itu.

Namun, mkdirmemiliki opsi berguna -p/ --parentsyang membuat struktur direktori penuh.

Dari man mkdir:

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

Jadi perintah yang Anda butuhkan dalam situasi spesifik Anda adalah:

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

Jika Anda berpikir Anda akan membutuhkan ini lebih sering dan tidak ingin mengetikkan path dua kali setiap kali, Anda juga dapat membuat fungsi Bash atau skrip untuk itu.

  • Fungsi Bash (tambahkan baris ini untuk secara terus ~/.bashrc-menerus tersedia untuk pengguna Anda, jika tidak maka akan menghilang lagi ketika Anda keluar dari terminal Anda):

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

    Ini bisa digunakan seperti ini:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Skrip Bash (simpan /usr/local/bin/touch2menggunakan sudo untuk membuatnya tersedia untuk semua pengguna, selain itu untuk pengguna ~/bin/touch2Anda saja):

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

    Jangan lupa untuk membuat skrip dapat dieksekusi menggunakan chmod +x /PATH/TO/touch2.

    Setelah itu Anda juga bisa menjalankannya seperti ini:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
Komandan Byte
sumber
dapatkah saya mengedit touch perintah asli dan menambahkan pergantian -pke sana?
MA Heshmat Khah
3
@HeshmatKhah Mungkin saja, tetapi tidak disarankan untuk membayangi executable sistem dengan skrip atau fungsi Anda sendiri. Anda dapat menggunakan nama touch-p(tanpa spasi!) Alih-alih touch2, jika Anda lebih suka "p", tetapi saya tidak akan mencoba mengganti perintah aslinya.
Byte Commander
1
Perhatikan bahwa Anda dapat menggunakan penghapusan sufiks alih-alih dirnamejuga, yaitu Anda dapat melakukannya mkdir -p "${1%/}" && touch "$1", sama seperti askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy
7

Seseorang dapat menggunakan installperintah dengan -Dflag.

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$ 

Jika kami memiliki banyak file, kami mungkin ingin mempertimbangkan untuk menggunakan daftar item (perhatikan, ingatlah untuk mengutip item dengan spasi), dan beralihlah ke item tersebut:

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

Atau sebagai alternatif dengan array:

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
Sergiy Kolodyazhnyy
sumber
Dengan pendekatan ini, file baru mendapatkan izin yang dapat dieksekusi secara default. Untuk memberikan izin yang sama dengan sentuhan, orang dapat menggunakaninstall -m 644 -D /dev/null <filepath>
ricab
1

Untuk tujuan ini, Anda dapat membuat fungsi Anda sendiri, contoh di bawah ini:

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

Pertama kita menyisipkan fungsi ke akhir file ~ / .bashrc menggunakan perintah echo. Fungsi -p flag in memungkinkan untuk membuat folder bersarang, seperti fldr2 dari contoh kita. Akhirnya kami memperbarui file dengan perintah sumber dan akhirnya menjalankan perintah mkfile yang baru dibuat

Purkhalo Alex
sumber