find . -name 'Name*'
デフォルト名を共有しますが、ファイルと一致するように最後にサイズ情報が追加されたいくつかの画像ファイルを一致させようとします。たとえば、次のようになります。
Name.jpg
[email protected]
Name-180x101.jpg
[email protected]
しかし、私のグローバルパターンも一致します。
NameLonger.jpg
[email protected]
NameLonger-180x101.jpg
[email protected]
2番目のグループは人気がありません。
find
最初のグループを攻撃し、2番目のグループを無視するようにコマンドをどのように調整できますか?グローバルパターンを使用できますか、それとも正規表現が必要ですか?
注:この場合、サイズ情報(-180x101)は常に「-」、ランダムな数字、「x」、ランダムな数字の順です。ファイルに「@2x」が含まれている場合は、常に最後にあります。
注:一般ファイル(例:Name.jpg
。
よろしくお願いします。
答え1
を使用して、zsh
必要なファイル名の形式を指定します。
print -rC1 -- **/Name(-<->x<->|)(@<->x|).jpg(DN)
print -rC1
:print
r
あ、1
C
コラムについて**/
:再帰的ワイルドカード(a|b)
:(x|)
EREのように交互に(x)?
<x-y>
:整数xからyまでの一連の10進数を表し、<->
任意の数字の一連の数字を表します。D
::dotglob
このように隠されたディレクトリも見ることができますfind
。N
::nullglob
一致するものがない場合は、文句を言わず、何もないものに拡張してください。
GNUfind
同等(ファイル順序がなく、./
各パスにプレフィックスが付いています):
LC_ALL=C find . -regextype posix-extended -regex \
'.*/Name(-[0-9]+x[0-9]+)?(@[0-9]+x)?\.jpg'
(BSDの場合は代わりにfind
使用)find -E .
find . -regextype posix-extended
標準を使用すると、find
おそらく次のようになります。
find . -name '.*/Name[-@.]*'
必要なのは排除だけならそれで十分ですNameLonger
。
単純ワイルドカードパターンには、OR+
演算子に対応するパターンはありません?
。|
複数の-name
AND を! -name
使用して AND と OR で同じ操作を実行できますが(たとえば、受け入れますがName-*x*.jpg
拒否、Name-*[!0-9]*x*[!0-9]*.jpg
など)、すべてのケースを処理するには何百回も必要なので、非常に面倒です。Name-x*
Name-*x.jpg
fnmatch()
この関数 ( で使用 ) の GNU libc 実装は、正規表現同等性をもたらすいくつかのfind -name
ksh88 拡張 glob 演算子 (フラグ) をサポートするように指示できます ( 、 ... また or でもサポートされています )。しかし、私が知っている限り、GNU実装ではそれを使用するように指示することもできます。FNM_EXTMATCH
+(...)
?(...)
zsh -o kshglob
bash -O extglob
find
POSIXlyでは、以下を使用して一致を最適化できますawk
。
LC_ALL=C find . -name 'Name*' -exec awk '
BEGIN {
for (i = 1; i < ARGC; i++)
if (ARGV[i] ~ "/Name(-[0-9]+x[0-9]+)?(@[0-9]+x)?\\.jpg$")
print ARGV[i]
}' {} +
(一部のファイルのパスが長すぎてコマンドラインに収まらないと失敗する可能性があることに注意してください。とにかく、すべてのfind
実装がそれより長いパスを持つファイルを見つけることはできませんPATH_MAX
。)