回答:
touch
:while read line; do touch "$line.txt"; done <in
while read line; [...]; done <in
:これはread
、read
それ自体が戻るまで実行され1
、ファイルの終わりに達したときに発生します。の入力read
はin
、<in
リダイレクトのためにターミナルからではなく、現在の作業ディレクトリで指定されたファイルから読み取られます。touch "$line.txt"
この実験touch
の拡大値で$line.txt
の含有量で、line
続い.txt
。touch
存在しない場合はファイルを作成し、存在する場合はアクセス時間を更新します。xargs
+ を使用するtouch
:xargs -a in -I name touch name.txt
-a in
:現在の作業ディレクトリにxargs
あるファイルから入力を読み取りますin
。-I name
:xargs
すべての出現をname
次のコマンドの現在の入力行に置き換えます。touch name
:touch
の置き換えられた値で実行されname
ます; 存在しない場合はファイルを作成し、存在する場合はアクセス時間を更新します。% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt in james.txt john.txt stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt in james.txt john.txt stewert.txt
read line
実際に行をどのように読みますか?@kos
<in
after done
はread
、while
ループ条件で各反復in
でin から1行を読み取って保存しline
ます。この方法でtouch "$line.txt"
は、ループの内側が読み取り行に拡張さ.txt
れ、最後になります。
while read line; do touch "$line.txt"; done <in
一人で仕事をしますか?ソースファイルはどこにありますか?
read
です。をご覧くださいhelp read
。
この特定のケースでは、1行につき1つの単語しかありませんが、次のこともできます。
xargs touch < file
ファイル名にスペースを含めることができる場合、これは破損することに注意してください。そのような場合、代わりにこれを使用してください:
xargs -I {} touch {} < file
ちょっとした楽しみのために、ここに他のいくつかのアプローチがあります(両方ともスペースを含む行を含む任意のファイル名を処理できます):
Perl
perl -ne '`touch "$_"`' file
Awk
awk '{printf "" > $0}' file
Linuxおよび同様のシステムでは、大部分のファイルの拡張子はオプションです。.txt
テキストファイルに拡張子を追加する理由はありません。あなたは自由にそうすることができますが、まったく違いはありません。したがって、とにかく拡張機能が必要な場合は、次のいずれかを使用します。
xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file
AWKもこのタスクに適しています。
testerdir:$ awk '{system("touch "$0)}' filelist
testerdir:$ ls
filelist george james john stewert
testerdir:$ awk '{system("touch "$0".txt")}' filelist
testerdir:$ ls
filelist george.txt james.txt john.txt stewert.txt
george james john stewert
別の方法、tee
。ファイルリストに複数の文字列が含まれる行があると、このアプローチは失敗することに注意してください。
testerdir:$ echo "" | tee $(cat filelist)
testerdir:$ ls
filelist george james john stewert
また、</dev/null tee $(cat filelist)
配管を避けたい場合は、同様に行うことができます
cp /dev/null
アプローチ(これが示すように、これはスペースを含むファイル名で動作します):
testerdir:$ cat filelist | xargs -I {} cp /dev/null "{}"
testerdir:$ ls
filelist FILE WITH SPACES george james john stewert
testerdir:$ ls FILE\ WITH\ SPACES
FILE WITH SPACES
echo "" | tee file1 file2 file2
です。ただし、ファイル名にスペースが含まれている場合は破損します。