UNIX" find "Befehl, match literal" dot"

Ich brauche Dateien, die mit " enden.pdf" oder ".png"; hier ist mein Versuch:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*[pdf|png]'

Dies schließt fälschlicherweise Dateien ein, die mit "Apdf", "Zpdf" usw. enden. (fehlender Literalpunkt vor der Dateierweiterung)

Ich habe versucht, das Muster anzupassen auf:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.[pdf|png]'

Aber dann werden keine Ergebnisse zurückgegeben. Flucht aus der . mit einem Backslash funktioniert nicht. Warum?

[0] $ uname -a

Darwin Robottinosino.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

Dank!

Author: Robottinosino, 2012-06-24

6 answers

Das problem ist nicht der Punkt. Es sind die Klammern. Eckige Klammern definieren eine Zeichenklasse; Ich bin mir ziemlich sicher, dass Sie versuchen, eine Abwechslung zu gruppieren. Dafür benötigen Sie runde Klammern. Sie müssen dafür einen erweiterten regulären Ausdruck verwenden, daher lautet der Befehl:

find -E /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.(pdf|png)'

Das -E Flag ist ein BSDism (OS X hat ein weitgehend BSD-ish Userland). Bei GNU find sagen Sie stattdessen -regextype posix-extended als Ausdruck und nicht als Flag (gemäß Dennis Williamsons Kommentar, was zweifellos richtig).

 3
Author: Tom Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-05-23 12:41:40

Sie könnten stattdessen einfach etwas wie \( -name '*.pdf' -or -name '*.png' \) verwenden, es sei denn, Sie haben einen anderen Grund, mit einem regulären Ausdruck übereinzustimmen.

 5
Author: millimoose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-06-24 14:46:09

Das Muster [pdf|png] entspricht jedem ein der Zeichen in den eckigen Klammern (einschließlich der Pipe).

Versuche das:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.\(pdf\|png\)'
 2
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-06-24 14:49:05
find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.[pdf|png]'
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-06-24 14:49:06

Sie sollten -name *.pdf und nicht .*[pdf|png].
Ihr Regex wird übereinstimmen .Apdf, .Zpng etc.

Sie können dies versuchen:
find . -type f | egrep '.pdf$|.png$'

 0
Author: cppcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-06-24 14:50:25

Dies sollte passen:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regextype posix-egrep -regex '.*\.(pdf|png)'

Wenn Ihre Version von find nichts über -regextype posix-egrep weiß, können Sie dies stattdessen versuchen:

find /Users/robottinosino/Desktop/_PublishMe_ -type f '.*\.\(pdf\|png\)'
 0
Author: thb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-06-24 14:51:11