web-dev-qa-db-ja.com

最近変更されたファイルを含む特定のフォルダー名のフォルダーを検索して一覧表示するにはどうすればよいですか?

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

これらは次のように設定されています。

  • software_folder
    • software_version_1
      • version_1.1
        • some_files
      • version_BETA
        • some_files
    • software_version_2
      • version_2.2
        • some_files
      • version_BETA
        • some_files

私は次のようなことを試しました:

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
neonfrontier

新しいファイル(*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

    これにより、パスのどこかに親ディレクトリがあり、-mtime -1のfindの規則によってnewが定義されている場合、名前がBETAで終わるすべての新しいファイルが検索されます。

  • 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

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

0
John1024