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.txt
where 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_"位置が重要かどうかわかりません)。