5

次のような多くのファイルを含む多くのサブディレクトリがあるApacheサーバーにディレクトリ(Linux/Unix)があります。

- 方向  
  - 2010_01/
    - 142_78596_101_322.pdf
    - 12_10.pdf
    - ...
  - 2010_02/   
    - ...

次のようなファイル名を持つすべてのファイルを見つけるにはどうすればよい*_*_*_*.pdfですか? ここで、* は常に数字です!!

私はこのようにそれを解決しようとします:

ls -1Rl 2010-01 | grep -i '\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$' | wc -l

しかし、正規表現\(\d)+[_](\d)+[_](\d)+[_](\d)+[.](pdf)$は grep では機能しません。

編集1 :ls -l 2010-03 | grep -E '(\d+_){3}\d+\.pdf' | wc -lたとえば、nullを返すだけです。だから完全には機能しない

4

3 に答える 3

3

を使ってみてくださいfind

あなたの仕様を満たすコマンド__*_*.pdf where * is always a digit

find 2010_10/ -regex '__\d+_\d+\.pdf'

ただし、試した正規表現に基づいて、アンダースコアで区切られた4つの数字のシーケンスが必要なようです。

(\d+_){3}\d+\.pdf

または、数字/アンダースコアのみを含むすべての名前に一致させたいですか?

[\d_]+\.pdf
于 2012-09-24T14:36:23.440 に答える
1

まず、egrep と grep を使用するか、拡張パターン用に -E を指定して grep を呼び出す必要があります。

だからこれは私のために働く:

$ cat test2.txt
- Dir  
  - 2010_01/
    - 142_78596_101_322.pdf
    - 12_10.pdf
    - ...
  - 2010_02/   
    - ...

次に、そのファイルを egrep します。

cat test2.txt | egrep '((?:\d+_){3}(?:\d+)\.pdf$)'
- 142_78596_101_322.pdf

パターン全体が括弧で囲まれているため、ファイル名全体がキャプチャされます。

このパターンは、従来のモードの grep では機能しないことに注意してください。

$ cat test2.txt | grep '((?:\d+_){3}(?:\d+)\.pdf$)'
... no return

ただし、拡張パターン スイッチを使用すると機能します (egrep の呼び出しと同じです)。

$ cat test2.txt | grep -E '((?:\d+_){3}(?:\d+)\.pdf$)'
- 142_78596_101_322.pdf 
于 2012-09-24T15:37:31.040 に答える
0

gbchaosmasterオオカミのおかげで、自分に合った方法が見つかりました。

ディレクトリに:

find . | grep -P "(\d+_){3}\d+\.pdf" | wc -l

ルート ディレクトリ:

find 20*/ | grep -P "(\d+_){3}\d+\.pdf" | wc -l
于 2012-09-25T08:27:55.270 に答える