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?

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
    

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.