最近変更されたサブディレクトリの一覧表示

最近変更されたサブディレクトリの一覧表示

そのため、最後に変更されたサブディレクトリを取得しようとします。

つまり。 1727 8つのバックアップがありますが、最新のバックアップディレクトリの内容のみを収集するように作成するスクリプトが必要です。各バックアップ実行は、対応する親ディレクトリの下に新しいサブディレクトリをインポートします。

[root@localhost backups]# find . -mindepth 2 -maxdepth 2 -not -empty -type d | grep -v logs
./1014/backup_1083219
./1014/backup_1082586
./1014/backup_1081955
./1014/backup_1081334
./1014/backup_1089443
./1014/backup_1080711
./1014/backup_1090690
./1014/backup_1091313
./1014/backup_1090062
./350/backup_1043735
./350/backup_1087678
./350/backup_1088301
./350/backup_1090170
./350/backup_222862
./350/backup_1059530
./350/backup_1088925
./350/backup_1091416
./350/backup_1089549
./350/backup_1090793
./1854/backup_1091300
./460/backup_1089536
./460/backup_1090781
./460/backup_1090159
./460/backup_1086423
./460/backup_1087045

| ls -td -- */ を追加できることはわかっていますが、それでも最新のサブディレクトリだけを含むディレクトリのリストを提供するのには役立ちません。

理想的には、次の内容を出力として使用します(サブフォルダがすべて新しく変更されたとします)。

./1727/backup_1059492
./1113/backup_862734
./881/backup_1088974
./1014/backup_1089443
./350/backup_1059530
./1854/backup_1091300
./460/backup_1086423

考えてみると、すべてのディレクトリとサブディレクトリを処理するためにwhileループが必要になるかもしれないと思いますが、よくわかりません。

ベストアンサー1

では、zsh次のことができます。

for d (<->(NF)) print -rC1 -- $d/backup_<->(N/om[1])

backup_xxx各ディレクトリのyyy最新の1つのサブディレクトリ。

または:

for d (<->(NF)) print -rC1 -- $d/backup_<->(N/n[-1])

最も高い数字を持つ人に。

  • <->すべてのASCII 10進数シーケンスと一致します。
  • (NF), (N/n[-1])... 指定するグローバル予選
  • /ファイル形式の選択目次
  • FFすべてのディレクトリを選択します(類似している/が空のディレクトリを除く)。
  • nnumericglobsortファイル名に一連の10進数が含まれている場合は、globの数値ソートをオンにします。
  • om o変更時間に基づいて並べ替えますm(たとえば、最新の項目から古い項目の順にls -t)。
  • [1]まず、[-1]最後のものを選択してください。
  • print -rC1 -- printr列にあります1 C

もう1つのアプローチは、1行あたりの最新から古い順にファイルをリストし、awk各トップレベルディレクトリの最初のディレクトリを使用して選択することです。ファイルのリストを飼いならされた名前のファイルに制限する限り、大丈夫です。

print -rC1 -- <->/backup_<->(N/om) | awk -F/ '!seen[$1]++'

(またはnOnサブディレクトリの中でom最も高いサブディレクトリの代わりに)。<number>backup_<number>

以前のソリューションとの違いは、以前の方法で代わりに使用したように、現在のディレクトリのシンボリックリンクに従うことです<->(N-F)<->(NF)

GNUを使用すると、find次の方法で実行できます。

LC_ALL=C find . -mindepth 2 -maxdepth 2 -regextype posix-extended \
  -regex './[0-9]+/backup_[0-9]+' -type d -printf '%T@/%P\n' |
  sort -rn |
  awk -F/ '!seen[$2]++ {print $2"/"$3"}'

または、サブディレクトリ<number>内の最上位サブディレクトリの場合backup_<number>

LC_ALL=C find . -mindepth 2 -maxdepth 2 -regextype posix-extended \
  -regex './[0-9]+/backup_[0-9]+' -type d -printf '%P\n' |
  sort -t_ -k2rn |
  awk -F/ '!seen[$2]++'

これらのディレクトリをリストにインポートすると、通話に転送できますgrep。たとえば、次のようになります。

(){ dirs=( $^@/backup_<->(N/om[1]) ) } <->(NF)
(( $#dirs )) && grep -re pattern -- $dirs

または、ここのディレクトリ名は非常に平凡で特殊文字を含まないので、上記の解決策のxargs1つを選択してパイプしますxargs -r grep -re pattern ---rGNU拡張で、両方ともxargs無関係grepの意味を持つ)。

無制限のディレクトリ名の場合は、NULで区切られたレコードを使用して(またはにオプションを追加-N)、オプションをprint追加できます。-v ORS='\0'gawk-0xargs


¹ディレクトリの変更時間は、ディレクトリ内のファイルデータが変更されたときではなく、ディレクトリにエントリが追加/削除/名前が変更されたときに更新されるため、実際の時間ではありません。

おすすめ記事