GNU/Linux >> Linux の 問題 >  >> Linux

指定されたパスの下にあるすべてのファイルに対して for-each ループを実行する方法は?

for -loop は、指定された文字列の (スペースで区切られた) 各エントリを反復処理します。

find を実際に実行するわけではありません コマンドですが、文字列として指定します (これは for によって反復されます) -loop). 二重引用符の代わりに、バッククォートまたは $() を使用します。 :

for line in $(find . -iname '*.txt'); do 
     echo "$line"
     ls -l "$line"
done

さらに、ファイルのパス/名前にスペースが含まれている場合、このメソッドは失敗します (for -loop は、スペースで区切られたエントリを反復します)。代わりに、dogbanes answer で説明されている方法を使用することをお勧めします。

エラーを明確にするには:

前述のとおり、for line in "find . -iname '*.txt'"; スペースで区切られたすべてのエントリを繰り返し処理します。

  • 見つける
  • .
  • イナメ
  • '*.txt' (だと思います...)

最初の 2 つは (望ましくない動作を除いて) エラーにはなりませんが、3 番目は実行時に問題があります:

ls -l -iname

多くの (bash) コマンドは 1 文字のオプションを組み合わせることができるため、 -iname -i -n -a -m -e と同じです .出来上がり:invalid option -- 'e' エラー!


ファイル名のスペースと改行を処理するため、ファイルをループするより良い方法を次に示します。

#!/bin/bash

find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
    echo "$line"
    ls -l "$line"    
done

コマンドを文字列として渡す代わりに、引用符の代わりにコマンド置換を使用して検索を実行します:

for line in $(find . -iname '*.txt'); do 
     echo $line
     ls -l $line; 
done

ファイル名にスペースと改行を使用した、よりコンパクトなバージョン:

find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;

Linux
  1. Linux の find コマンドを使用してファイルを検索する方法

  2. Linuxでディレクトリをループする方法は?

  3. bash のすべてのサブディレクトリにあるすべてのファイルを gzip する方法

  1. 最大のディレクトリまたは最大のファイルを見つける方法は?

  2. ファイルシステム上のすべてのハードリンクされたファイルを見つけるにはどうすればよいですか?

  3. ディレクトリの下のすべてのシンボリックリンクを解除するには?

  1. コンソールで大きなファイルをチェックする方法

  2. ファイルの行をループする方法は?

  3. 現在のディレクトリのすべてのファイル名で1つの文字を別の文字に置き換える方法は?