Hier ist mein Problem:
Ich habe eine Datei mit -r im Namen:-r.jpg
Beim Versuch, eins auszuführen, mv *.jpg old/
erhalte ich Folgendes:
mv: invalid option -- 'r'
Sogar für
for g in *.jpg;do echo $g &&mv "${g}" old/;done
Ich habe den gleichen Fehler.
Antwort1
Die meisten Befehlszeilenprogramme verfügen über eine Vorgabe zur TrennungOptionenausArgumente.
Das verhindert eine Vielzahl von Problemen mit"besonders"Dateinamen, die wie Optionen aussehen.
Das gebräuchlichste Trennzeichen am Ende der Optionen sind zwei Bindestriche --
oder , --was auch von unterstützt wird mv
.
Mit anderen Worten:
mv [OPTIONS] -- SOURCE DEST
oder da Sie keine Optionen angegeben haben:
mv -- *.jpg old/
Antwort2
Die einfachste Lösung wäre, dem Dateinamen die ./
Beschreibung des relativen Pfads voranzustellen.
for g in *.jpg; do echo $g && mv "./${g}" old/; done
Es ist auch möglich, den absoluten Pfad zu verwenden
for g in $(pwd)/*.jpg; do echo $g && mv $g old/; done
Alternativ können Sie den Befehl verwenden, find
da dieser bereits den relativen Pfad angibt (Sie können ihn verwenden, --max-depth
wenn Sie nur das aktuelle Verzeichnis verarbeiten möchten).
for g in $(find . -name "*jpg"); do mv $g old; done
Und im schlimmsten Fall, wenn Sie viele komplexe, nicht analysierbare Zeichen haben, können Sie auf die Inode-Nummern in Kombination mit verweisen find -inum
und Ihre Dateien entsprechend verarbeiten.
$ for g in $(ls -i1 ./*jpg | cut -f1 -d' '); do find . -inum $g -print0 | xargs -0 -I '{}' mv '{}' old; done