我有一个包含目录列表的文件。例如
/foo/bar/dir1
/foo/bar/dir2
/foo/bar/dir3
我想创建所有这些目录。这就是我所做的:
for dir in $(cat myfile); do mkdir $dir; done
在避免“无用地使用猫”的同时,正确的做法是什么?
理想情况下,答案将集中于 Ksh88,但我也对其他 shell 感兴趣
答案1
程序员的使用建议xargs
通常是最好的,但另一种选择是使用重定向到循环while
,这允许执行附加命令并设置变量:
while read -r dir; do mkdir $dir; done < myfile
更复杂结构的一个例子是:
now=`date +%Y%m%d.%H%M%S`
while read -r dir; do
newdistfile="/tmp/dist-`echo $dir | tr / _`.tgz"
mv $dir ~/backups/$dir.$now &&
mkdir $dir &&
tar xzfC $newdistfile $dir
done < myfile
xargs
如果不编写“帮助程序”,这是无法做到的。
答案2
我会做类似的事情
xargs mkdir < myfile
答案3
至少在 bash 中,只要文件名不包含空格和换行符,就会这样:
mkdir $(< myfile)
作品。所以我们对 的使用也是无用的for
。xargs
< 与 相比, 不会在 bash 中启动新进程,cat
但我不知道ksh
.
答案4
我不会说这是对 cat 的无用使用。
在里面经典感,UUOC 意味着写:
cat file | some_command and its args ...
而不是同等且更便宜的
<file some_command and its args ...
或者(同等且更经典)
some_command and its args ... < file
在这种情况下:
for dir in $(cat myfile); do mkdir $dir; done
没有通过管道将 的输出cat
传送到的命令。
当然有一些替代方案不使用cat
.特别是,对于 bash 和 ksh 来说$(<myfile)
可能比 更快$(cat myfile)
,尽管并非所有 shell 都支持该构造。但我不会将原始代码称为“无用的 cat”,就像我不会将 AProgrammer 的解决方案称为“无用的 xargs”一样。