创建文件及其父目录

创建文件及其父目录

我知道该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

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

答案1

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/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
    

答案2

mkdir -p parent/child && touch $_/file.txt

答案3

可以使用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

答案4

我用他妈的使用此命令让我的生活更轻松。这是一个 CLI 工具,可以纠正以前的控制台命令中的错误。

$ touch a/folder/that/does/not/exist/file
touch: cannot touch 'a/folder/that/does/not/exist/file': No such file or directory
$ fuck
mkdir -p a/folder/that/does/not/exist && touch a/folder/that/does/not/exist/file [enter/↑/↓/ctrl+c]
$ ls a/folder/that/does/not/exist/file
a/folder/that/does/not/exist/file

相关内容