如何避免在解析文件时无用地使用 cat?

如何避免在解析文件时无用地使用 cat?

我有一个包含目录列表的文件。例如

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

作品。所以我们对 的使用也是无用的forxargs

< 与 相比, 不会在 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”一样。

相关内容