创建文件及其父目录


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

而不是手动创建完整路径,然后创建文件?

Answers:


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脚本(将其存储在/usr/local/bin/touch2sudo中,以使其对所有用户可用,否则~/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'7

3
@HeshmatKhah应该可以,但不建议使用自己的脚本或函数来屏蔽系统可执行文件。如果您更喜欢使用“ p”,则可以使用名称touch-p(无空格!)代替touch2,但是我不会尝试替换原始命令。
字节指挥官

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

首先,我们使用echo命令在〜/ .bashrc文件的末尾插入一个函数。函数中的-p标志允许创建嵌套文件夹,例如本例中的fldr2。最后,我们使用源命令更新文件,并最终执行最近创建的mkfile命令

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.