こんにちは。シリーズABC1 *、ABC12 *、ABC13 * ABC14 *シリーズなどで始まるファイルのリストがあります。
findコマンドを使用してABC12 *とABC13 *のリストを取得したいと思います。
次のコマンドを使用していますが、正確な結果を抽出できません。
ls -ltr |grep -e "ABC12" |find . -type f -mtime 15
答え1
-name
オプション検索モード。角括弧はORの内容を意味します。
find . -type f -name 'ABC1[23]*'
答え2
この-mtime 15
意味は参考にしてください「次の24時間単位で四捨五入した年齢は15歳です。」つまり、14*24
数時間前に15*24
変更されたファイルです。空多くの時間帯と同様に、年間1日23時間と1日25時間があります。これがあなたが望むものであると仮定し、を使用して次のことを行うzsh
ことができます。
ls -lrtd -- **/ABC1[23](D.m15)
または:
find . -type f -name 'ABC1[23]' -mtime 15 -exec ls -lrtd {} +
ただし、ファイル数がコマンドに渡されたパラメータと環境の最大サイズを超えると、最初のファイルは失敗し、2番目のファイルを使用すると複数のインスタンスが実行されるため、リストは時系列に並べls
替えられません。要求通り-t
。
zsh
GNUを使用すると、ls
次のようにこの問題を解決できます。
autoload zargs
zargs -- **/ABC1[23](D.m15Om) -- ls -lUd
つまり、zsh
必要に応じてリストをソートして1つ以上の呼び出しに渡しますが、リストをソートしないように指示します。他の実装では役に立ちませんが、他の無害なソートに置き換えて実行することができます。ls
ls
ls
U
rt
ABC17
、、withのABC23
代わりに->のような範囲が必要な場合は、次のようにします。ABC12
ABC13
zsh
ls -lrtd -- **/ABC<17-23>(D.m15)
(ただし、ABC<17-23>
一致はABC17
一致しませんABC0000017
。これが問題の場合(glob演算子にはオプションが必要ですが)<17-23>
に変更して、2桁の数字のみが一致するかどうかを確認するか、前にゼロの数字を除外します。(<17-23>~^??)
extendedglob
pattern~exclude
(<17-23>~0*)
ファイル名の場合スタートABC12
相対的なはい ABC12
では、その場合は
ls -lrtd -- **/ABC<17-23>*(D.m15)
ただし、これはABC170でも一致することに注意してください。これを防ぐには:
setopt extendedglob
ls -lrtd -- **/ABC<17-23>^[0-9]*(D.m15)
つまり、<17-23>
10進数で始まらないすべての項目が続きます。
これに対応する内容find
(前にゼロを許可せず、多数のファイルについて上記の問題があり、ファイル名に無効な文字が含まれており、./
すべてのファイルにプレフィックスがある場合に潜在的な問題があるにもかかわらず)と同じです。
find . \( -name 'ABC1[7-9]*' -o -name 'ABC2[0-3]*' \) \
! -name 'ABC??[0-9]*' -mtime 15 -type f \
-exec ls -lrtd {} +