Answers:
我经常遇到这种情况,因此我只是在.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'
touchp
一样mkdir -p
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"
test
不需要; mkdir -p
如果目录已经存在,则不执行任何操作。甚至不返回错误。
我打算提出建议,因为它可以使它保持一行,尽管单独设置变量可以使您更改它并很容易地从历史记录中重新运行命令。
B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"
可以“伪造”它。
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
&&
组合器对按顺序运行的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
cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
上具有UUOC的所有内容进行了解释,然后将子外壳化为xargs,然后将其子外壳化回外壳中,这时while read
循环更有意义了
while read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt
。您无法对UUOC进行10秒的互联网搜索的事实也说明了这一点