mkdir -p用于文件


24

mkdir -p将创建一个目录;它还将根据需要创建父目录。

文件是否存在类似的命令,该命令将根据需要创建文件和父目录?


不是我知道的..但是您可以执行mkdir -p / path / to / make && touch / path / to / file ...这将在您根据需要创建的新目录结构中创建一个空文件。

1
@Kansha将其与dirname和结合起来,basename我们只需要一个参数即可;利润!:)

是的,打个好电话。

Answers:


29

如果给出源文件,安装将执行此操作/dev/null。该-D参数表示要创建所有父目录:

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c 
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

不确定这是否是错误-手册页中未提及其与设备文件的行为。您也可以给它一个空白文件(mktemp例如,使用新建的文件)作为源。


7

不,据我所知。但是,你可以随时使用mkdir -ptouch对方后:

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"

3

我经常遇到这种情况,因此我只是在.bashrc文件中编写了一个函数。看起来像这样

function create() {
    arg=$1
    num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
    make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
    mkdir -p $make_dirs && touch $arg
}

因此,当我想在不存在的目录路径中创建文件时,我会说

create what/is/it  # will create dirs 'what' and 'is', with file 'it' inside 'is'

1
天哪 -谢谢你,我把它叫做touchp一样mkdir -p
ecoologic


0

我打算提出建议,因为它可以使它保持一行,尽管单独设置变量可以使您更改它并很容易地从历史记录中重新运行命令。

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"

0

可以“伪造”它。

首先,一些必要的理论:

Rob Griffiths于2007年在Macworld.com上发布了一篇文章,标题为“ 轻松创建许多新文件夹 ”,他在其中讨论了使用xargs命令读取文件列表以使用创建目录的方法mkdir

xargs能够用标记引用placeholder{}),该-I标记包含传递给的每个参数的值xargs。这是使用该标志与不使用该标志之间的区别:

$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt

xargs还可以使用以下sh -c标志运行任意的shell命令:

foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'

结合概念:

我们可以结合这些概念mkdir -p,而不是mkdir在概念@ldx答案产生这样的:

$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'

此命令基本上将每个文件名映射到以行分隔的文件列表中,将文件部分砍掉,使用创建目录,mkdir -p然后touch将文件名放入其各自的目录中。

以下是上述命令中发生的情况的细分:

例如说我的files.txt样子是这样的:

deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
  • cat files.txt 产生 deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
  • deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt 被输送到 xargs
  • 因为我们使用-I {}xargs会将每个参数转换为它自己的命令,所以现在有了:
    • deeply/nested/foo/bar.txt
    • deeply/nested/baz/fiz.txt
  • 然后,我们运行一个shell命令,该命令使用&&组合器对按顺序运行的3个命令进行分组-第一个命令使用之前注册的占位符将文件存储在环境变量中(在下一个文件传递中重新使用),因此现在有:
    • f=deeply/nested/foo/bar.txt
    • f=deeply/nested/baz/fiz.txt
  • 现在我们有了一个可以传递给的变量mkdir -p,但是我们需要剪切文件名。使用起来很简单'${f%/*}'
    • mkdir -p deeply/nested/foo/
    • mkdir -p deeply/nested/baz/
  • 然后f,当我们执行touch以下操作时,我们只需重新完整引用变量即可:
    • touch deeply/nested/foo/bar.txt
    • touch deeply/nested/baz/fiz.txt

2
您已经对本质cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'上具有UUOC的所有内容进行了解释,然后将子外壳化为xargs,然后将其子外壳化回外壳中,这时while read循环更有意义了
Steven Penny

1
我承认我对* nix命令不是最了解-我什至不知道UUOC是什么-但我看不出这是一个多么糟糕的答案。经过研究,测试,它是您原始问题的可行解决方案。它具有建设性(与您粗鲁的评论不同)。拜托,如果您觉得我在这里做了本不应该做的不负责任的事情,请进一步详细说明- 原因。我不在乎没有实质性的自以为是的辩论。
剃须胡须

1
我最后的评论很好地解释了这一点。您的整个答案最好写成while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt。您无法对UUOC进行10秒的互联网搜索的事实也说明了这一点
史蒂文·彭尼
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.