定期的に単純なテキストファイルのリストを解析して更新したい定期的に更新されるフォルダセットがあります。リストはrsyncと一緒に使用されるので、より簡単な同期のためにsedを使用してファイル名を減らしました。
それらは次のように設定されます。
- ソフトウェアフォルダ
- ソフトウェアバージョン_1
- バージョン_1.1
- 一部のファイル
- バージョン_ベータ
- 一部のファイル
- バージョン_1.1
- ソフトウェアバージョン_2
- バージョン_2.2
- 一部のファイル
- バージョン_ベータ
- 一部のファイル
- バージョン_2.2
- ソフトウェアバージョン_1
私は同様のことを試しました:
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
これは、パスのどこかに親ディレクトリがあるすべての新しいファイルを探し、
BETA
findのルールが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で区切られた入力を理解するツールを使用して読む必要があります。