ディレクトリのリストを含むファイルがあります。例えば
/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)
働くだから私たちがそれを使うことも役に立ちませんfor
。xargs
<と比較してbashで新しいプロセスを開始しませcat
んksh
。
答え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」と呼ぶことはありません。