ディレクトリで "ls -R" を実行すると、次の結果が表示されます。
./dir1
dir2 file1.txt file2.txt
./dir1/dir2
file3.txt file4.txt
しかし、私に与えられた命令が欲しい
./dir1/file1.txt
./dir1/file2.txt
./dir1/dir2/file3.txt
./dir1/dir2/file4.txt
これにより、forループですべてのファイルを処理するために使用できます。
答え1
欲しいfind(1)
。 これはまさにあなたが望むことをするでしょう。ファイルタイプ(ディレクトリを除く)、指定されたファイルよりも最新のタイムスタンプなど、さまざまなフィルタ基準を指定できます。マニュアルページでは、これらの条件について詳しく説明します。
また、このオプションを見てください-exec
。出力を繰り返す代わりに使用することもできます。
答え2
bash ≥4またはzshまたはksh93 ≥o+ 1を使用している場合は、シェルに再帰的なワイルドカードを実行させることができます。**/
ワイルドカードは任意の深さのディレクトリと一致します。 Bashでは(bash)を使用してこの機能を有効にする必要がありshopt -s globstar
、bash 4.2以前は**/
ディレクトリへのシンボリックリンクを通過することに注意してください。 ksh93 ではset -o globstar
(ksh93) が必要で、zsh では常に有効になっています。
for x in **/*.txt; do …
スクリプトを別のシェルに移植する必要がある場合は、find
コマンドの使用、これは仕事にぴったりのツールです。これはfind
2つの方法で動作する外部コマンドです。つまり、ファイルのリストを生成し、各ファイルに対してコマンドを実行できます。各ファイルでコマンドを実行するには、次のようにします-exec
。
find . -type f -name '*.txt' -exec chmod a+r {} +
1 Bourne シェルでない場合は、次の機能fish
も使用できます。tcsh
答え3
tree
また、素晴らしいツールです。
私は使う
tree -Dpushfag --du
たとえば、最大2つのレベルまで深さ制限を追加できます。
tree -Dpushfag --du -L 2