そのため、最後に変更されたサブディレクトリを取得しようとします。
つまり。 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])
... 指定するグローバル予選/
ファイル形式の選択目次F
F
すべてのディレクトリを選択します(類似している/
が空のディレクトリを除く)。n
numericglobsort
ファイル名に一連の10進数が含まれている場合は、globの数値ソートをオンにします。om
o
変更時間に基づいて並べ替えますm
(たとえば、最新の項目から古い項目の順にls -t
)。[1]
まず、[-1]
最後のものを選択してください。print -rC1 --
print
r
列にあります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
または、ここのディレクトリ名は非常に平凡で特殊文字を含まないので、上記の解決策のxargs
1つを選択してパイプしますxargs -r grep -re pattern --
(-r
GNU拡張で、両方ともxargs
無関係grep
の意味を持つ)。
無制限のディレクトリ名の場合は、NULで区切られたレコードを使用して(またはにオプションを追加-N
)、オプションをprint
追加できます。-v ORS='\0'
gawk
-0
xargs
¹ディレクトリの変更時間は、ディレクトリ内のファイルデータが変更されたときではなく、ディレクトリにエントリが追加/削除/名前が変更されたときに更新されるため、実際の時間ではありません。