Tạo tập tin và thư mục mẹ của nó


19

Tôi biết touchlệnh đó tạo một tệp:

touch test1.txt

nhưng làm thế nào tôi có thể tạo một tập tin và đường dẫn đầy đủ của nó?

ví dụ máy tính để bàn của tôi không chứa gì:

~/Desktop/$ ls
~/Desktop/$

và tôi muốn tạo 1.txt trong ~/Desktop/a/b/c/d/e/f/g/h/1.txt. Tôi có thể làm điều này với một lệnh đơn giản như:

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

thay vì tạo đường dẫn đầy đủ bằng tay và sau đó tạo tập tin?

Câu trả lời:


23

touchkhông thể tạo thư mục, bạn cần mkdirđiều đó.

Tuy nhiên, mkdircó tùy chọn -p/ hữu ích --parentstạo ra cấu trúc thư mục đầy đủ.

Từ man mkdir:

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

Vì vậy, lệnh bạn cần trong tình huống cụ thể của bạn là:

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

Nếu bạn nghĩ rằng bạn sẽ cần điều này thường xuyên hơn và không muốn nhập đường dẫn hai lần mỗi lần, bạn cũng có thể tạo hàm Bash hoặc tập lệnh cho nó.

  • Hàm Bash (nối dòng này để ~/.bashrccó sẵn cho người dùng của bạn, nếu không nó sẽ biến mất một lần nữa khi bạn thoát khỏi thiết bị đầu cuối của mình):

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

    Nó có thể được sử dụng đơn giản như thế này:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Tập lệnh Bash (lưu trữ nó /usr/local/bin/touch2bằng cách sử dụng sudo để cung cấp cho tất cả người dùng, chỉ ~/bin/touch2dành cho người dùng của bạn):

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

    Đừng quên làm cho tập lệnh thực thi bằng cách sử dụng chmod +x /PATH/TO/touch2.

    Sau đó, bạn cũng có thể chạy nó như thế này:

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

Tôi có thể chỉnh sửa touch lệnh gốc và thêm chuyển đổi -pcho nó không?
MA Heshmat Khah

3
@HeshmatKhah Điều đó là có thể, nhưng không nên để bóng thực thi hệ thống với các tập lệnh hoặc hàm của riêng bạn. Bạn có thể sử dụng tên touch-p(không có dấu cách!) Thay vì touch2, nếu bạn thích "p", nhưng tôi sẽ không cố gắng thay thế lệnh ban đầu.
Chỉ huy Byte

1
Lưu ý rằng bạn cũng có thể sử dụng loại bỏ hậu tố dirname, ví dụ như bạn có thể làm mkdir -p "${1%/}" && touch "$1", tương tự như Askubfox.com/a/928544/295286
Sergiy Kolodyazhnyy

7

Người ta có thể sử dụng installlệnh với -Dcờ.

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$ 

Nếu chúng tôi có nhiều tệp, chúng tôi có thể muốn xem xét sử dụng danh sách các mục (lưu ý, hãy nhớ trích dẫn các mục có khoảng trắng) và lặp lại trên chúng:

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

Hoặc thay thế với mảng:

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

Theo cách tiếp cận này, tệp mới được cấp quyền thực thi theo mặc định. Để cung cấp cho nó các quyền tương tự mà nó sẽ nhận được bằng cảm ứng, người ta có thể sử dụnginstall -m 644 -D /dev/null <filepath>
ricab

1

Với mục đích này, bạn có thể tạo chức năng của riêng mình, ví dụ dưới đây:

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

Đầu tiên chúng ta chèn một hàm vào cuối tệp ~ / .bashrc bằng lệnh echo. Cờ -p trong hàm cho phép tạo các thư mục lồng nhau, chẳng hạn như fldr2 từ ví dụ của chúng tôi. Cuối cùng, chúng tôi cập nhật tệp bằng lệnh nguồn và cuối cùng thực hiện lệnh mkfile được tạo gần đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.