web-dev-qa-db-ja.com

テキストファイルにディレクトリの名前が含まれるように、すべてのサブディレクトリにテキストファイルを作成する方法

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ループで行うことは可能ですか?

3
Programmer
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

printfechoよりも前者では正しく処理されるが後者では正しく処理されない特殊なケースがあるため、私は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
4
Quasímodo
find . -name 'dir_[0-9]*'  -type d -execdir bash -c 'name=$0;printf "${name##*/}\n" > "$name/file_${name##*_}.txt"' '{}' \;

-execdirを使用して、検索結果から複数のコマンドを実行します

name=$0; =>各ディレクトリ名を$ name変数に格納して処理します。