Ich habe ein Programm, das Argumente in der folgenden Syntax erwartet:
prog [-f filename | -g filename1 filename2] ...
Jedem Dateinamen muss das -f
Flag vorangestellt werden . Die folgenden Aufrufe sind beispielsweise gültig für prog
:
prog -f a.txt -g b.txt c.txt -f d.txt
prog -g a.txt b.txt -g c.txt d.txt
prog -f a.txt -f b.txt -f c.txt
… Aber die folgenden sind nicht:
prog -f a.txt b.txt
prog -f a.txt -g b.txt
prog a.txt
In meinem Fall interessiert mich nur die -f
Option.
Ich habe viele Dateien in einem Verzeichnis, die alle auf enden .txt
. Sie sehen so aus:
important-files/
├── a.txt
├── b.txt
├── c.txt
├── d.txt
└── filename with spaces.txt
Ich möchte vermeiden, dass jede Datei einzeln aufgelistet werden muss. Normalerweise würde ich dafür einen einfachen Glob verwenden:
$ prog important-files/*.txt
Dies funktioniert jedoch nicht, da der folgende ungültige Aufruf erzeugt wird:
$ prog important-files/a.txt important-files/b.txt important-files/c.txt important-files/d.txt 'important-files/filename with spaces.txt'
… Wenn ich diesen Aufruf wirklich will:
$ prog -f important-files/a.txt -f important-files/b.txt -f important-files/c.txt -f important-files/d.txt -f 'important-files/filename with spaces.txt'
… Da jedem Dateinamen ein Präfix vorangestellt werden muss, -f
um prog
zu verstehen, dass sie nicht so interpretiert werden sollten -g
.
Was ist der kürzeste Weg, um einen Glob zu verwenden und jeder der Dateien, auf die er erweitert wird, ein Flag voranzustellen?
*.txt(P:-f:)
in der Tat (Warum sollten Sie dort einen Backslash setzen?).
*.txt(P:\\-f:)