Wie kann ich einen neuen Namen für eine Datei generieren, wenn eine Datei mit demselben Namen vorhanden ist? In einer Desktop-Umgebung wird ein neuer Name generiert, indem eine Nummer an das Ende des Dateinamens angehängt wird. Wie kann dies jedoch über die Befehlszeile erreicht werden?
Ich verwende das Android-Betriebssystem mit Busybox.
mktemp
?mktemp
wird nicht funktionieren.Antworten:
Angenommen, Sie haben eine POSIX-Shell, können Sie dies tun:
Wie man das benutzt
Dies ist eine Funktion, also speichern Sie sie in Ihrer
~/.bashrc
und rufen Sie sie wie gewohnt aufmv
.Was das macht
mv
ausführbaren Datei in derMV
VariablenDEST
DEST
vorhanden und kein Verzeichnis ist, geht diese Funktion davon aus, dass Ihr Umbenennen versucht, eine Datei zu blockieren.
, das die Erweiterung kennzeichnet), die Erweiterung (alles nach dem Finale.
) und die Anzahl (falls vorhanden; alles im Präfix nach dem Finale-
) extrahiert .mv a.txt b.txt
sie zuerst versucht wirdmv a.txt b-001.txt
. Dieser nächstemv
Aufruf muss auch die Funktion selbst sein, dab-001.txt
wir, falls vorhanden, den Zähler weiter erhöhen möchten, bis wir einen neuen Dateinamen finden, der nicht vorhanden ist.mv
ausführbare Datei mit Ihren ursprünglichen Argumenten aufgerufen.Vorsichtsmaßnahmen
foo-001.txt
wird sie in verschobenfoo-001-001.txt
.Anmerkungen
3
in derprintf
Anweisung nach Belieben.quelle
/tmp
es sich um ein vorhandenes Verzeichnis handelt, und/bin/mv file1 /tmp
ich habe nicht gesehen, wo das Problem liegt.Im Allgemeinen verwende ich das Tool
mktemp
, um zuverlässige temporäre Dateien zu erstellen. Standardmäßig werden Dateien erstellt, es können jedoch auch Verzeichnisse über den-d
Switch erstellt werden.Beispiel
So können Sie einige temporäre Namen für Dateien in Ihrem aktuellen Verzeichnis erstellen.
Dadurch werden die Dateien für Sie erstellt.
Verweise
quelle
mktemp
auf Android, aber trotzdem +1 von mir, da dies eine gute Antwort auf eine gute Frage ist, U & L weise./system/bin/sh
und scheintsh
kompatibel zu sein - Konstrukte wieif [ -w $file ]
Arbeitmv
undrename
sind verfügbar -, daher sollte dort ein Skript funktionieren, das dies nur mit integrierten Funktionen ausführt.Hier ist eine Alternative zu Joseph Rs Drehbuch, das keine der Einschränkungen enthält! Es wird ein numerisches Suffix an einen Pfadnamen angehängt (der Pfad kann ein Verzeichnis oder eine Datei sein), wobei der Suffixwert erhöht wird, bis einer gefunden wird, der noch nicht vorhanden ist. Andere Dienstprogramme verwenden beispielsweise
logrotate
ein ähnliches Muster, drehen jedoch alle vorhandenen Kopien so, dass die neue immer '0' für ein Suffix hat. Da dies in diesem Sinne keine Rotation ist, werde ich es nennendotmv
. Denken Sie daran, dassfile.0
dies die älteste Kopie sein wird.Zum Beispiel:
Benennt um
somefile.txt
somefile.txt.0
, sofern letzteres nicht vorhanden ist. In diesem Fall ist dies der Fallsomefile.txt.1
und so weiter. Sie können mehr als eine Datei (dotmv this that "the other thing"
usw.) auflisten, alle werden punktverschoben.Ich glaube, dies ist POSIX-konform - es läuft mit
set -o posix
on bash (aber das ist ein zweifelhafter Test). Ich habe auch mit der Android (Jelly Bean 4.2.1) Shell getestet und es funktioniert dort. Unter Android müssen Sie jedoch den Shebang wie angegeben ändern oder ausführensh dotmv
- was Sie auch tun werden, es sei denn, Sie haben ein gerootetes Gerät, da es sonst keine Möglichkeit gibt, ein Skript ausführbar zu machen. Wenn Sie den Shebang ändern, können Sie ihn verwendenexec dotmv
.Hoffentlich ist die Logik hier sehr einfach. Dies kann in Python, C oder einer anderen vollständigen prozeduralen Sprache mit Datei-E / A implementiert werden.
quelle