Angenommen, ich habe einen Ordner mit TXT- , PDF- und anderen Dateien. Ich möchte die "anderen" Dateien auflisten (dh Dateien ohne die Endungen .txt oder .pdf ). Haben Sie Ratschläge dazu?
Ich weiß, wie man Dateien auflistet, die keine bestimmte Erweiterung haben. Wenn ich zum Beispiel alle Dateien mit Ausnahme der TXT- Dateien auflisten möchte , dann auch nicht
find -not -iname "*.txt"
oder
ls | grep -v '\.txt$' | column
scheinen zu funktionieren. Aber, wie kann ich Liste alles außer TXT - Dateien oder PDF - Dateien? Es scheint, dass ich eine Art logisches "oder" in find
oder verwenden muss grep
.
ls
vsfind
vs globbing für versteckte Punktedateien unterschiedlich sein kann.find
Unterverzeichnisse werden wie rekursiv durchlaufenls
. Verwenden Sie-maxdepth 1
mitfind
, um das Verhalten zu verbessernls
.Antworten:
Vorausgesetzt, man hat eine entsprechende Version von
ls
, ist dies möglicherweise der einfachste Weg:Wenn Sie alle Unterverzeichnisse durchlaufen möchten:
quelle
ls
Optionen sind nicht portierbar.ls
gehört sowieso nicht wirklich in tragbare Skripte, daher gehe ich davon aus, dass das OP nur nach der interaktiven Verwendung fragt.Finden Sie Unterstützungen
-o
Sie benötigen die Klammer, um den Vorrang richtig zu machen. Finden macht eine Menge Sachen; Ich schlage vor, die Manpage durchzulesen.
Sie können auch ein oder in
grep
(aber eigentlich sollten Sie die Ausgabe von nicht analysierenls
)quelle
ls
?find
Manpage empfehle ich von ganzem Herzen die Artikel zu Unix Power Toolsfind
, wie docstore.mik.ua/orelly/unix3/upt/ch09_06.htm und docstore.mik.ua/orelly/unix3/upt/ch09_12.htmfind . NOT ( *.txt OR *.pdf )
Bei
bash
erweitertem Globbing (einschalten mitshopt -s extglob
) sollte der Glob!(*.txt|*.pdf)
funktionieren. Sie können diesen Glob direkt an jeden Befehl übergeben, der Dateiargumente akzeptiert, einschließlich, aber nicht beschränkt aufls
.quelle
-d
, um dies zu vermeiden:ls -d !(*.txt|*.pdf)
In
zsh
mitextendedglob
:oder
Oder mit
kshglob
(ja, das ist ksh globbing nicht "bash extended globbing"):Denken Sie jedoch daran, dass diese auch Punktedateien ausschließen.
ksh93 hat das
FIGNORE
(mis) -Feature:quelle
Dies entspricht aufgrund der Gesetze von De Morgan dem Befehl mit dem Operator OR .
quelle
Wie von derobert vorgeschlagen, ist Ihre beste Wette zu verwenden
find
. Sie können das Ergebnis jedoch auch in einer Pipeline mit anderen Befehlen verwenden.GNU (und einige BSDs)
find
unterstützen das-print0
Prädikat, das angibt, den Dateinamen zu drucken, der mit einem NUL- Zeichen abgeschlossen ist. Dieses Zeichen ist in einem Dateinamen nicht zulässig und garantiert, dass es nicht zu einer Kollision kommt. Andere Befehle können angewiesen werden, die NUL als Eingabebegrenzer zu verwenden.Das wichtigste davon ist GNU
xargs
, das den von Ihnen angegebenen Befehl ausführt und ihm die Liste der Dateien als Befehlszeilenargumente übergibt. Sie möchtenxargs -r0
zusammen mit find's ausgeführt werden.-print0
Zum Beispiel:Dies druckt sicher ein langes Verzeichnis aller von der Anzeige pdf und txt - Dateien, einschließlich diejenigen mit Leerzeichen oder nicht druckbare Zeichen im Namen.
Sie können es auch mit GNU
tar
wie folgt verwenden:Dadurch wird eine tar.gz-Datei mit allen Dateien erstellt, deren Namen nicht mit .tar.gz enden
rsync
Akzeptiert auch null-getrennte Dateien mit dem-0
Parameter, wie auch einige andere. Aberxargs
ist der Kleber, den Sie normalerweise für diese Art von Zweck verwenden. Entweder das oderfind
's-exec
Feature.quelle
tar
Befehlsbeispiel ist gut. Für die meisten Zwecke-exec
ist jedoch eine bessere Passform.Wenn Sie kein Unterverzeichnis haben
sollte auch funktionieren!
Aber
ist der übliche Weg.
quelle
Wenn Sie eine bash-kompatible Shell verwenden, können Sie außerdem die Variable GLOBIGNORE verwenden, um Wiederholungen vom Mustervergleich auszuschließen. Vom mann:
In Ihrem speziellen Fall:
Bitte beachten Sie, dass ich diesen Befehl als Sub-Shell (in Klammern) ausführe, um die GLOBIGNORE-Umgebungsvariable meiner interaktiven Shell nicht zu ändern.
quelle