Ist es möglich, die Datei mit der Sequenznummer {1..10} umzubenennen?

Ist es möglich, die Datei mit der Sequenznummer {1..10} umzubenennen?

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 touchwird 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 touchDienstprogramm eine beliebige Anzahl von Argumenten in der Befehlszeile akzeptiert. Hinweis: Dadurch werden 10 Dateien erstellt, nicht eine Datei.

Das Dienstprogramm hat jedoch mveine 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 lsauf diese Weise. Verwenden Sie stattdessen

for file in ./*; do
    # process "$file"
done

Die Ausgabe von lsist 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

verwandte Informationen