Ich muss einige doppelte Dateien sammeln und möchte Namenskollisionen vermeiden. Das Problem ist, dass diese Dateisammlung möglicherweise durch eine andere Ausführung meines Skripts hinzugefügt wird, bevor die Dateien bereinigt werden und die Anzahl nur weiter erhöht werden soll.
Ich entschied mich für eine einfache till-Schleife, um die Zahl wie folgt zu erhöhen.
until [[ ! -f ${PWD}/DUPES/${num}-$1 ]]; do
num=$((num +1))
done
mv --no-clobber $1 ${PWD}/DUPES/${num}-$1
Ich kann mir nicht vorstellen, jemals 1k Dateien in einem extremen Beispiel zu überschreiten, also sind meine Fragen ...
Ist dies ein schrecklich ineffizienter Weg, um dies zu erreichen? Sollte ich die vorhandenen Dateien analysieren, um die höchste führende Zahl zu erhalten, die von dort aus inkrementiert werden kann, oder ist dies für das von mir vorgestellte extreme Beispiel in Ordnung? Oder gibt es insgesamt einen besseren Weg?
quelle
mktemp
, möglicherweise mit Ihrem Dateinamen als Basis. (Wir gehen dann davon aus, dassmktemp
dies seine Arbeit effizient erledigt.)Antworten:
Sie könnten es so machen:
Sie würden sofort sicherstellen, dass mehrere Instanzen nicht denselben Namen für eine bestimmte Datei sichern können, und Ihre Variable erhöhen.
Der
/dev/null
<stderr löscht nur die Beschwerde der Shell über eine vorhandene Datei, wenn er versucht, die Ausgabe abzuschneiden / umzuleiten, und ein vorhandenes Ziel findet. Während noclobber aktiviert ist , wird es eine andere Datei nicht überschreiben - es wird nuropen()
ein neues Geschäft, wenn Sie verwenden>|
. Sie brauchen sich also nicht zu beschweren, da es darum geht, vorhandene Dateien zu erhöhen, bis ein nicht vorhandener Name gefunden wird.In Bezug auf den Leistungsaspekt wäre es besser, wenn Sie nicht bei Null anfangen würden. Oder wenn Sie versucht haben, den Unterschied auszugleichen. Ich denke, das Obige könnte etwas verbessert werden wie:
... aber bis zu 1000 müssen Sie sich wahrscheinlich keine schrecklichen Sorgen machen. Ich habe in ein paar Sekunden 65.000 über zufällige Namen.
Übrigens - Sie könnten denken, Sie könnten einfach:
... aber es funktioniert nicht in einer
bash
Shell.Aus irgendeinem Grund
bash
erfolgt die Zuweisung in einem anderen Kontext für Weiterleitungen - und daher erfolgen die Erweiterungen in einer seltsamen Reihenfolge. Sie benötigen also einen separaten einfachen Befehl, um den korrekten$num
Wert zu erweitern, mit dem ich hier komme&&
. Ansonsten aber:quelle
GNU mv hat eine
--backup
Option, die nützlich sein kann. Die folgende Interaktion zeigt, wie die Dateien umbenannt werden, wenn das Ziel vorhanden ist:In diesem Beispiel wurde die Originaldatei
o
ino.~1~
,a
too.~2~
,b
too.~3~
undc
to umbenannto
. Dies wird also nicht auf die gleiche Weise umbenannt wie der von Ihnen veröffentlichte Code, dies kann jedoch abhängig von Ihren genauen Anforderungen akzeptabel sein.quelle
mv
natürlich unter der Annahme von GNU )Stellen Sie sich zwei Instanzen Ihres Vorschlags vor, die gleichzeitig ausgeführt werden und gleichzeitig gestartet wurden. Sie werden beide feststellen, dass (sagen wir) num = 4 verfügbar ist und beide versuchen, denselben Zielnamen zu verwenden.
Ich kann diese Alternative derzeit nicht testen, aber so etwas könnte ausreichen
quelle