最近変更されたファイルを含む特定のフォルダ名を持つフォルダを見つけて一覧表示するには?

最近変更されたファイルを含む特定のフォルダ名を持つフォルダを見つけて一覧表示するには?

定期的に単純なテキストファイルのリストを解析して更新したい定期的に更新されるフォルダセットがあります。リストはrsyncと一緒に使用されるので、より簡単な同期のためにsedを使用してファイル名を減らしました。

それらは次のように設定されます。

  • ソフトウェアフォルダ
    • ソフトウェアバージョン_1
      • バージョン_1.1
        • 一部のファイル
      • バージョン_ベータ
        • 一部のファイル
    • ソフトウェアバージョン_2
      • バージョン_2.2
        • 一部のファイル
      • バージョン_ベータ
        • 一部のファイル

私は同様のことを試しました:

for dir in `find -maxdepth 2 -type d -name '*BETA'`; do test `find $dir -type f -mtime -1` | echo $dir | sed "s|^\./||" >> list.txt; done

ただし、出力にはまだすべてのベータフォルダが一覧表示されます(.aspxファイルに「不明なオペランド」エラーが表示されますか?)。

変更されたファイルを1つ以上見つけてフォルダのリストを更新した後、スクリプトは次のフォルダに移動できるため、各フォルダの残りのファイルを繰り返す必要がない場合は、追加の利点があります。

ベストアンサー1

*BETA新しいファイルを含むすべてのディレクトリ()を見つけて、-mtime -1そのディレクトリ名をここに保存するには、list.txt次のようにします。

find -type f -path '*BETA/*' -mtime -1 | sed 's|^\./||; s|BETA/.*|BETA|' | sort -u >list.txt

あなたの目標は、ファイルに改行で区切られたデータを生成することです。これは、ディレクトリまたはlist.txtファイルの名前自体に改行を含めたくないことです。もしそうなら、もちろん別の出力フォーマットが必要です。

どのように動作しますか?

  • find -type f -path '*BETA/*' -mtime -1

    これは、パスのどこかに親ディレクトリがあるすべての新しいファイルを探し、BETAfindのルールがnewを定義するとき、その名前は-mtime -1

  • sed 's|^\./||; s|BETA/.*|BETA|'

    これにより、ファイル名から最初の文字が削除され、./結果BETAはBETAディレクトリの名前になります。

  • sort -u

    生成されたディレクトリのリストにはsed重複したエントリがあります。重複項目が削除されます。

  • >list.txt

    これにより、出力は次の場所に保存されます。list.txt

より一般的なソリューション

次の方法は、ディレクトリまたはファイル名に改行文字が含まれていても安全です(GNUツールが必要な場合があります)。

find -type f -path '*BETA/*' -mtime -1 -print0 | sed -z 's|^\./||; s|BETA/.*|BETA|' | sort -zu >list.out

list.outこれにより、nullで区切られた形式のディレクトリ名を含むファイルが作成されます。ファイルまたはディレクトリ名にNULL文字が表示されないため、これは安全なアプローチです。使用するには、list.outもちろん、nullで区切られた入力を理解するツールを使用して読む必要があります。

おすすめ記事