
Ich habe Zweifel. Ich muss die Datei mit der Sequenznummer 1 bis 10 umbenennen. Ich kann eine Datei mit folgendem Parameter erstellen.
touch file.$(date +%Y).$$.{1..10}
Aber ich kann die Datei mit dem folgenden Befehl nicht umbenennen. Warum wird {1..10} nicht akzeptiert? Weil ich eine Datei wie folgt umbenennen möchte. Der Befehl mv akzeptiert {1..10}?
file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.
also ist der folgende Befehl richtig?
for file in $(ls);
do
mv $file file.$(date +%Y%m).$$.{1..10}
done
Antwort1
Durch die Klammererweiterung {1..10}
wird die Befehlszeile um mehrere Argumente erweitert.
Beispielsweise touch
wird die Befehlszeile zu etwas wie
touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
bevor es ausgeführt wird. Das ist ok, da das touch
Dienstprogramm eine beliebige Anzahl von Argumenten in der Befehlszeile akzeptiert. Hinweis: Dadurch werden 10 Dateien erstellt, nicht eine Datei.
Das Dienstprogramm hat jedoch mv
eine andere Semantik als touch
. Es erwartet eine oder mehrere Quelldateien/-verzeichnisse und am Ende eine einzelne Zieldatei/ein einzelnes Zielverzeichnis.
Das bedeutet, dass wenn
mv $file $file.$(date +%Y%m).$$.{1..10}
wird erweitert zu etwas wie
mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10
Es wird davon ausgegangen, dass Sie umziehen möchtenalledie Dateien, mit Ausnahme des letzten Elements in der Befehlszeile. Außerdem wird erwartet, dass das letzte Element in der Befehlszeile ein Verzeichnisname ist (da Sie mehrere Dinge verschieben).
Mir ist nicht klar, was Sie in dieser Schleife eigentlich tun möchten, daher kann ich nicht weiter dazu Stellung nehmen, wie dieses Problem gelöst werden könnte.
Was die Schleife selbst betrifft,BitteVerwenden Sie die Ausgabe von niemals ls
auf diese Weise. Verwenden Sie stattdessen
for file in ./*; do
# process "$file"
done
Die Ausgabe von ls
ist für Sieansehenist es aus mehreren Gründen nicht für die Verwendung durch ein Skript geeignet. Siehehttp://unix.stackexchange.com/questions/128985/why-not-parse-ls
Setzen Sie Ihre Variablen außerdem immer in doppelte Anführungszeichen. Siehehttp://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells