数値を含むファイル名を探す

数値を含むファイル名を探す

数値を含むファイル名を見つけて、数値の範囲にリストしたいと思います。たとえば、私のディレクトリには次のものがあります。 **

Ion_001_rawlib.bam
Ion_002_rawlib.bam
Ion_003_rawlib.bam
Ion_004_rawlib.bam
Ion_005_rawlib.bam
...
Ion_020_rawlib.bam

**

003から005までのIonファイル名だけをリストしたいと思います。私はこれを試みます:

find -name '*Ion_*[3-5]*rawlib.bam'

しかし、望む効果が得られませんでした。これが可能かどうかご存知ですか?ありがとうございます。

ベストアンサー1

zshシェルを使用すると、次のことができます。

print -rC1 Ion_<3-5>_rawlib.bam

<x-y>ここでは、与えられた範囲内から正の整数のリテラル10進数表現に一致するグローバル演算子です。xy

再帰的に:

print -rC1 -- **/Ion_<3-5>_rawlib.bam

(D)隠しフォルダでもこれらのファイルを探したい場合、または一致するファイルが存在しないときにエラーとして処理されないようにするには、(N)追加してください。)

find述語をサポートする実装では、-regex次のことができます。

LC_ALL=C find . -regex '.*/Ion_0*[345]_rawlib\.bam'

*(0個以上の()バイト(.with LC_ALL=C)、それに続く/Ion_0個以上の(*0、または文字の1つ、次の3ファイルパスと一致します。)45rawlib.bam

ここでは、3..5の範囲では比較的簡単ですが、78..123のような範囲の方がより苦痛です(そして他の形式を使用する正規表現がサポートされているためfind-regex

標準は正規表現の代わりにデフォルトのシェルワイルドカードを使用して実行されるファイル名の一致と一致のみをfindサポートしますが、ワイルドカードには正規表現演算子(0個以上の先行原子)と同じ演算子がなく、その演算子は正規表現(0個以上の文字) )と同じです。 、たとえばmatch onと一致します。-name-path**.*Ion_*[3-5]_rawlib.bamIon_9994_rawlib.bam*999

ただし、この単純なケースでは、さまざまなパターンと否定を使用してこれを実行できます。たとえば、次のようになります。

LC_ALL=C find . -name 'Ion_*[345]_rawlib.bam' \
              ! -name 'Ion_*[!0]*?_rawlib.bam'

非再帰的:

LC_ALL=C find . ! -name . -prune \
    -name 'Ion_*[345]_rawlib.bam' \
  ! -name 'Ion_*[!0]*?_rawlib.bam'

名前に整数の10進表現を含むファイルを見つけるには、その範囲xに一致するパターン(sなど)が必要ですが、パターンが他の数字で囲まれていないことを確認する必要があります。たとえば、、とが含まれており、すべて一致します。yzsh<x-y>foo305.txt3055<3-5>

ではzsh次のようになります。

print -rC1 -- (|*[^0-9])<3-5>(|[^0-9]*)

つまり<3-5>、 (3, 03, 003... と一致) の後に数字でないで終わる文字列または文字列が来、数字でないで始まる文字列または文字列が続きます。

BSDの使用find:

LC_ALL=C find -E . -regex '.*/([^/]*[^0-9])?0*[3-5]([^0-9][^/]*)?'

GNUと同じfindですが。-E .. -regextype posix-extended

busyboxの使用find(コンパイル方法によって異なります):

busybox find . -regex '.*/\([^/]*[^0-9]\)\?0*[3-5]\([^0-9][^/]*\)\?'

find別のアプローチは、レポートファイルリストを使用することですが、perlリストフィルタリングなどのより高いレベルの言語を使用することです。

find . -print0 | perl -l -0ne '
  if (m{[^/]*\z}) {
    for $n ($& =~ /\d+/g) {
      if ($n >= 3 && $n <= 5) {
        print;
        next LINE;
      }
    }
  }'

perlここでは、各ファイルのデフォルト名からすべての10進数シーケンスを抽出し、これらの数字シーケンスの1つ以上が3..5の範囲の数字を表す場合にファイルを出力するために使用されます。

おすすめ記事