フルパスを返す間、デフォルト名がパターンと一致するファイルを探します。

フルパスを返す間、デフォルト名がパターンと一致するファイルを探します。

find結果を正規表現と一致させる必要があります。ファイルは次のとおりです。

/path/1/file1.001.txt
/path/1/file2.001.txt
/path/1/file1.001
/path/2/file3.002.txt
/path/2/pure_file3.002.txt

など。

xxx.txtwhere is 3桁の数字で終わるすべてのディレクトリ内のすべてのファイルを一致させる必要があり、xxx前に単語が含まれていないファイル名のみを一致させる必要がありますpure_。また、フルパスを返す必要があります。

次のファイルを除くすべての操作を実行しましたpure_

find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.*\.[0-9]{3}.txt' 

私は試した:

find /path/ -mindepth 1 -maxdepth 2 -type f | grep -P '.+(?!pure).*\.[0-9]{3}.txt' 

しかし、私が言うなら/path/1/

ls -1 | grep -P '^(?!pure).*\.[0-9]{3}.txt'

一方、次のファイルは正しく除外されます。

ls -1 | grep -P '(?!pure).*\.[0-9]{3}.txt'

確かに。

それで、それはおそらく始まらないフルパスでどのように一致させるかによって異なりますpure_。私は正規表現を十分に理解していません。

答え1

find正規表現一致なし:

find /path -type f ! -name 'pure_*' -name '*[0-9][0-9][0-9].txt'

/path名前は3pure_桁の数字と.txt

答え2

findで始まるファイルを除外するように指示するか、次の式を使用して実行pure_できます。grep-regex

find ./path -mindepth 1 -maxdepth 2 -type f ! -name 'pure_*' -regex '.*\.[0-9][0-9][0-9].txt$'

例のモックディレクトリにあるコピーを使用すると、次の結果が得られます。

./path/1/file1.001.txt
./path/1/file2.001.txt
./path/2/file3.002.txt

答え3

find -type f | egrep "[0-9]{3}\.txt$" | grep -v pure_

find現在のディレクトリから始まるファイルを見つけます。

拡張正規表現を適用して、egrep行末に追加された3桁の「.txt」をフィルタリングします(ドットはエスケープする必要があり、そうでない場合は「Atxt」も一致します)。

"pure_"文字列を含む()行をフィルタリングしますgrep-v"pure_"位置が重要かどうかわかりません)。

関連情報