すべてのサブディレクトリ/ファイルにコマンドを適用する

すべてのサブディレクトリ/ファイルにコマンドを適用する

親ディレクトリには、スペースで区切られた1つ以上のテキストファイルを含む複数のサブディレクトリがあります。

私が望むものを出力しますが、単一のファイルにのみ出力する次のコマンドがあります。INPUTFILE.txt

awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' INPUTFILE.txt

何千ものサブディレクトリがあり、ファイル名が異なることを考えると、このコマンドを親ディレクトリのすべてのサブディレクトリにどのように適用できますか?

答え1

まず、cd目的の親ディレクトリに移動します。

次に、次を使用してコマンドをfind実行しますawk

find -type f -exec awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' {} +

説明する

  • 既定では既に再帰的であるため、すべてのサブディレクトリに対してこれを行います。
  • -type ffファイルやディレクトリ以外のファイルに検索を制限します。
  • この-exec somecommand {} +構文はコマンドを実行し、見つかったファイルパスをユーザーが作成した場所に配置します。{}
  • このオプションは、クエリ結果をパラメータとして保存しながら1つ+のインスタンスのみを実行するため、より効率的です。一方、これを実行する別の方法(ここには示されていません)は、各ファイル名に対して一度awkを実行し、それほど効率的ではありません。awk{}

答え2

素早く素早く汚い方法はループを使用することですが、まず何かを設定する必要があります。以下に、awkコマンドを実行したいファイルの名前とパスを含むテキストファイルを示します。親ディレクトリで実行する必要があります。

find . -type f -print >> source.txt

次にループを実行します。

for i in $(cat source.txt); do 
  awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> OUTPUTFILE.txt
done

単一の出力ファイルが必要かどうか、複数の出力ファイルが必要かどうかはわかりません。

複数の出力ファイルが必要な場合は、次のことができます。

for i in $(cat source.txt); do 
  awk '{if (NF>4){print $1, $2, $3 , "0" } else {print $0}}' $i >> $i.processed.txt
done

答え3

修正する:回答を書いた後、質問が変わりました。

for a in */INPUTFILE.txt
do 
   cp "$a" "$a.bak" 
   YOUR-AWK "$a.bak" > "$a" 
done

新しい質問がおかしいようですね!正しく理解したら

YOUR-AWK */*.txt > output.txt

関連情報