findのexec関数を使う

findのexec関数を使う

forループで次のことを試みます。

  • 基準を満たすファイルを探す
  • ファイル名をログファイルにエコーします。
  • ファイルを圧縮します。

スクリプトがファイルを見つけてその名前を画面に表示させることはできますが、ファイルにパイプすることはできません。 (まだgzip部分はテストしていません)

以下はスクリプトの関連部分です($LOGCLEAN_FILEスクリプトの前の部分に存在して作成されました)。

for F in `find . -type f \( ! -name '*.gz' \) -a \( ! -name '*.Z' \) -mtime +7`
do

        {
        print "Will be compressing file  ${F}" >> $LOGCLEAN_FILE
        } ; 
        ##gzip $F
done

テキストなしでスクリプトを実行すると、" >> $LOGCLEAN_FILE"出力が画面に表示されます。

私は何が間違っていましたか?

批判を歓迎します。私はまだ学んでいます。

答え1

find実際、シェルループで出力を再現する必要はありません。梱包したい場合ファイル名一覧、一般式は次のとおりです。

find ... | gzip > logfile.gz

圧縮したい場合ファイル自体、次のようになります。

find ... | tar -czvf archive.tar.gz -T -

処理するファイル名のリスト(それぞれ標準入力を表す)tarをファイルから読み取るように指示します。--TAKA--files-from=オプションはGNU tarにあります。他のバージョンはわかりません。)もちろん、\n名前を含むファイルを処理すると、このオプションは中断されます。

答え2

find 出力を安定して後処理できません。使用-exec:find

find . -type f ! -name '*.gz' ! -name '*.Z' -mtime +7 -exec sh -c '
  for i do
    printf "%s\n" "Will be compressing file $i"
    gzip "$i"
  done' sh {} + >> log

GNU 実装では、findsh を実行しなくてもエスケープできます。

find . -type f ! -name '*.gz' ! -name '*.Z' -mtime +7 \
  -printf 'Will be compressing file %p\n' -exec gzip {} + >> log

答え3

>>次のようにループ(after)の外側にリダイレクト()を配置しますdone

for i in $(find . -type f \( ! -name '*.gz' \) -a \( ! -name '*.Z' \) -mtime +7);
  do echo "Will be compressing file  ${i}";
  ##gzip $i;
done >> $LOGCLEAN_FILE

あるいは、最後にコマンドのコメントを削除したい場合は、次のgzipことを考慮できます。

for i in $(find . -type f \( ! -name '*.gz' \) -a \( ! -name '*.Z' \) -mtime +7);
  do gzip "$i" && echo "Successfully compressed ${i}";
done >> $LOGCLEAN_FILE

前のコマンドがエラーなしで終了した場合、これは&&次のコマンドを実行することを意味します。0

答え4

出力ファイルにパイプする場合は、ファイルパスを繰り返します。

findのexec関数を使う

...繰り返しを処理してください。

expandサブシェルを介して明示的なファイルのリストを繰り返し、出力をstdoutとして呼び出すことによって個々のファイルを上書きしたいと思います。この回答で解決された問題

find $(git ls-files | grep '.py$') \
    -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;

このスレッドの他の回答は一般的な解決策を提供していないため、この回答のわずかに変更されたバージョンを再公開しています。これが私が見た唯一の方法であり、ファイルパスを繰り返すときにのみ機能します。

findを使用してその名前を繰り返すことができるように、繰り返しエントリの名前の付いたファイルを生成することを誤用する解決策を想像できます。


失敗した試み:

bash -c ...find exec呼び出しと同様に、forループ内で試してみました。しかし、空の出力ファイルでも同じ問題が発生します。

免責事項:私の問題が正確に何であるかわかりません。 find execを使用する前のすべての試みで、私が記録すると予想されるすべての出力ファイルを上書きし、私の問題は後で空のファイルであることです。

関連情報