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!
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).
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.
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\)'
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]'
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$'
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\)'
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