フォルダをループし、ファイルをテキストにリストする Bash スクリプト

フォルダをループし、ファイルをテキストにリストする Bash スクリプト

Windows CMD スクリプトでこれを行うことはできますが、現在は Raspberry Pi 経由で Debian を使用しています。

私がやりたいのは...

(現在のフォルダ内)

  • サブフォルダーごとに...
    • original_filenames.txtというファイルを作成します。
    • フォルダ名をこのoriginal_filenames.txtにエコーします
    • すべてのファイル(サブフォルダを含む)を original_filenames.txt にリストします。

答え1

シェルループの使用:

for dir in */; do
    { printf '%s\n' "$dir"
      ( cd "$dir" && find . )
    } >"$dir/original_filenames.txt"
done

これは、現在のディレクトリ内のすべてのサブディレクトリを反復処理します。ループの本体はディレクトリの名前を出力し、次にそのディレクトリ内のすべてのファイルとディレクトリのリストを再帰的に出力します。この出力は、original_filenames.txtディレクトリ内のファイルに送られます。

短い:

for dir in */; do
    find "$dir" >"$dir/original_filenames.txt"
done

これにより、ファイルに書き込まれるパス名がすべてサブフォルダーの名前で始まるという点で、出力が若干異なります。

ディレクトリ名に興味がなく、通常のファイルのパス名だけが必要な場合は、ディレクトリ名の後にfindwith を使用します。-type f


計画している場合は注意してください使用して何かの出力ファイルを生成する場合、見つかったパス名のいずれかに改行が含まれていると(Unix システムでは完全に可能)、これは失敗します(または少なくとも非常に問題になります)。

答え2

findこれは、コマンドとexecオプションを使用して次のように実行できます。

find . -type d \( ! -name . \) -exec bash -c '
    dirname=$(basename "{}") && 
    cd "{}" && 
    echo "{}" > original_filenames.txt && 
    ls | grep -Fv original_filenames.txt >> original_filenames.txt
' \;

役に立つと思われる StackOverflow の投稿を以下に示します。

関連情報