ls * .pdf beschwert sich: ls: ungültige Option - '_'

503
nate

Ich bin es gewohnt, 'ls' wie in Linux Mint zu verwenden, zB 'ls * .pdf', aber in dieser Debian-Variante beschwert sich 'ls .pdf'. Ich benutze stattdessen eine Länge 'find -maxdepth 1 -type f -name " .pdf" -print ".

Lesen Sie dies: ls seltsames Arbeiten hat nicht viel geholfen. Ich habe das bash_completions-Paket und ich habe keine seltsamen Aliase für 'ls' in meiner '~ / .bashrc'-Datei - ich bearbeite niemals das' / etc / profile 'oder das globale, wo immer es ist.

Nur zu raten, ich habe die Lösung in der verknüpften Frage angewendet, aber es hat nicht funktioniert. Ich verstehe "vollständig" nicht vollständig - ich denke, es ist Teil von "readline" - daher würde vielleicht auch eine kurze Erklärung helfen (es hat keine "man" -Seite).

Dies funktioniert jedoch: 'complete -p ls * .pdf', was 'complete --help' sagt:

 -p print existing completion specifications in a reusable format 

und ich frage mich, ob ich diese "Regel" dauerhaft anwenden sollte? mit dem '-D'-Flag ...?

BEARBEITEN

Gerade dieses Problem auch bemerkt:

for f in *.pdf; do mv "$f" "BOOK - $F"; done  mv: invalid option -- 'R' 

BEARBEITEN 2

Ich habe die beiden obigen Befehle ausprobiert und sie funktionieren gut - auf der Partition meines Betriebssystems. Die Probleme sind, wenn ich zu einer anderen Partition wechsle, mit dem funktionierenden Linux Mint und den PDF-Dateien, die ich ändern möchte, dass diese Befehle fehlschlagen. Beide Partitionen sind ext4, beide haben denselben Benutzernamen, Hostnamen, UID / GID, Berechtigungen usw.

0

2 Antworten auf die Frage

1
Gilles Quenot

Es scheint, als hätten Sie Dateinamen mit führendem Bindestrich -. Verwenden Sie also:

for f in *.pdf; do mv -- "$f" "BOOK - $F"; done 

Von man bash:

A --signalisiert das Ende der Optionen und deaktiviert die weitere Optionsverarbeitung. Alle Argumente nach dem - werden als Dateinamen und Argumente behandelt. Ein Argument von - ist äquivalent zu -.

Ist das eine Art Bash-Magie? Ich sehe es nicht in der Manpage für mv ... nate vor 6 Jahren 0
Es ist nicht spezifisch für mv, aber für shell bedeutet es _end of options_ Gilles Quenot vor 6 Jahren 1
@nate, siehe [this] (https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html) für weitere Informationen. TL; DR: Dies ist eine Konvention, die von GNU libc (der Standard-C-Bibliothek, die normalerweise auf Linux-basierten Systemen verwendet wird) und den mit ihrer Hilfe geschriebenen Kern- / Datei-Dienstprogrammen vorgeschlagen wird. Die Konvention bleibt fest (für immer). kostix vor 6 Jahren 0
Ich würde auch erklären, warum * das beobachtete Verhalten auftritt. Unix-Shells (im Gegensatz zu denen von Windows) erweitern "Wildcards" von selbst; Das heißt, wenn Sie `some_command * .pdf` in Ihrer Shell ausführen, erkennt die Shell` * .pdf` und versucht, die Menge der Dateien in ihrem aktuellen Verzeichnis zu finden. In diesem Fall wird dem Befehl "some_command" mehrere verschiedene * Argumente übergeben. Dabei handelt es sich jeweils um den Namen einer einzelnen Datei, die übereinstimmt. Wenn der Abgleich fehlschlägt (keine Dateien gefunden), wird das Argument wie folgt übergeben: `* .pdf`. kostix vor 6 Jahren 0
… Als Konsequenz könnten Sie sogar Dateien mit den Namen "-", "-a" und "-b" haben und "some_command - *" mit einigen interessanten (und unvorhersehbaren Ergebnissen) angeben ;-) Was? Ich führe zu, ist der für Produktions-Code, den Sie fast immer `find $ dir -type f -name '* .pdf' -print0 | suchen möchten xargs -0 -n 1 some_command` kostix vor 6 Jahren 0
1
Ivan

Wenn Sie Dateinamen haben, die mit einem -Minus- oder Bindestrich beginnen, werden sie von vielen Programmen als Optionen interpretiert.

Sie können ./den Pfad voranstellen, um ihn zu vermeiden:

ls ./*.pdf 

Viele Programme erlauben auch das Einfügen von --Argumenten vor dem Dateinamen, um das Ende der Optionen anzuzeigen:

ls -- *.pdf 

Die empfohlene Vorgehensweise für Benutzer besteht natürlich darin, die Dateien umzubenennen.

Ich verstehe. Daher hat nur ein einfacher Dateiname, der mit einem Bindestrich beginnt, diese Fehler verursacht. Ich habe einen gefunden und umbenannt und jetzt funktioniert es. nate vor 6 Jahren 0