5つの空のディレクトリがあります。
[X]$ ls
dir_1 dir_2 dir_3 dir_4 dir_5
これらのすべてのディレクトリにテキストファイルを作成して、テキストファイルにそのディレクトリの名前が含まれるようにするにはどうすればよいですか?したがって、たとえば、dir_1
にはテキストファイルが含まれますfile_1.txt
このテキストファイルにはテキストdir_1
初期化、 dir_2
にはテキストファイルが含まれていますfile_2.txt
テキストdir_2
など。
情報を探しましたが、わかりませんでした。私は最近Linuxを学び始めました。私は次のようなことをしなければなりませんか?
find . -type d -exec touch (something?)
そして、これをforループで行うことは可能ですか?
for d in dir_*; do
printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
done
$d
は、各ディレクトリ名に展開されます。${d##*_}
は、最後のアンダースコアまでのすべてを$d
から削除するため、ディレクトリ名の末尾の番号に展開されます。詳細は BASHマニュアル または POSIX仕様 のパラメーター拡張セクションをご覧ください。printf "%s\n" "$d" > "$d/file_${d##*_}.txt"
は、ディレクトリ名をそのディレクトリ内のtxtファイルに書き込みます。ワンライナー付き:
for d in dir_*; do printf "%s\n" "$d" > "$d/file_${d##*_}.txt"; done
printf
はecho
よりも前者では正しく処理されるが後者では正しく処理されない特殊なケースがあるため、私はecho
を優先しました。詳細は echoよりprintfが優れている理由 をご覧ください。
dir_
でも始まるディレクトリ以外を回避する必要がある場合、オプション1は、上記のスクリプトのprintf
ステートメントの直前に[ -d "$d" ] &&
テストを追加することです。オプション2では、dir_*/
を使用して、ディレクトリのみが一致するようにします。
for d in dir_*/; do
dirn=${d%%/}
printf "%s\n" "$dirn" > "${d}file_${dirn##*_}.txt"
done
find . -name 'dir_[0-9]*' -type d -execdir bash -c 'name=$0;printf "${name##*/}\n" > "$name/file_${name##*_}.txt"' '{}' \;
-execdir
を使用して、検索結果から複数のコマンドを実行します
name=$0;
=>各ディレクトリ名を$ name変数に格納して処理します。