数値を含むファイル名を見つけて、数値の範囲にリストしたいと思います。たとえば、私のディレクトリには次のものがあります。 **
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進数表現に一致するグローバル演算子です。x
y
再帰的に:
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
ファイルパスと一致します。)4
5
rawlib.bam
ここでは、3..5の範囲では比較的簡単ですが、78..123のような範囲の方がより苦痛です(そして他の形式を使用する正規表現がサポートされているためfind
、-regex
標準は正規表現の代わりにデフォルトのシェルワイルドカードを使用して実行されるファイル名の一致と一致のみをfind
サポートしますが、ワイルドカードには正規表現演算子(0個以上の先行原子)と同じ演算子がなく、その演算子は正規表現(0個以上の文字) )と同じです。 、たとえばmatch onと一致します。-name
-path
*
*
.*
Ion_*[3-5]_rawlib.bam
Ion_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など)が必要ですが、パターンが他の数字で囲まれていないことを確認する必要があります。たとえば、、とが含まれており、すべて一致します。y
zsh
<x-y>
foo305.txt
3
05
5
<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の範囲の数字を表す場合にファイルを出力するために使用されます。