ファイルを解析するときに無駄なcatの使用を防ぐ方法は?

ファイルを解析するときに無駄なcatの使用を防ぐ方法は?

ディレクトリのリストを含むファイルがあります。例えば

/foo/bar/dir1
/foo/bar/dir2
/foo/bar/dir3

私はこれらすべてのディレクトリを作成したいと思います。これが私がしたことです:

for dir in $(cat myfile); do mkdir $dir; done

「猫の無駄な利用」を避けながら、すべき正しいことは何ですか?

理想的には、答えはKsh88に焦点を当てますが、他のシェルにも興味があります。

答え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で新しいプロセスを開始しませcatksh

答え4

私はこれが猫の役に立たない使用だと言いたくありません。

内部にクラシックな感覚、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)しかし、私はAProgrammerのソリューションを「useless xargs」と呼ぶよりももはや元のコードを「useless cat」と呼ぶことはありません。

関連情報