Ich versuche, eine Änderung rückgängig zu machen, die ich über vorgenommen habe rename
.
Ich habe Dateien in einem Unterordner umbenannt und dann gedankenlos versucht, die ..
Originalnamen mit folgendem Befehl zu löschen:
rename "s/.././" *
Jetzt habe ich einen Ordner mit 600 Dateien, wobei die ersten beiden Buchstaben jedes Dateinamens geändert wurden in.zzyGir*
Gibt es eine Möglichkeit, die "." wieder in die Anfangsbuchstaben jedes Dateinamens zu ändern, ohne die ganze Datei zu verlieren?
Ich habe verschiedene Dinge ohne Erfolg ausprobiert, zum Beispiel:
rename "s/./Di/; *
Ich bin auch für Lösungen offen, bei denen jeweils nur eine Datei auf einmal gelöscht wird. Mein Hauptziel besteht darin, den Verlust der Dateien zu vermeiden.
Antwort1
Die ersten beiden Buchstaben sind Geschichte. Keine Chance, sie zurückzubekommen. Aber Sie können die Dateien umbenennen, um die führenden Buchstaben .
mit dem folgenden Verfahren zu entfernen
Stellen Sie sicher, dass Sie bash
in einem Terminal
bash
Gehen Sie in Ihren Ordner mit den falschen Dateinamen
shopt -s dotglob
rename -n 's/^\./Di/' *
Wenn alles gut aussieht
rename 's/^\./Di/' *
Enden mit
shopt -u dotglob
Erläuterung
rename -n "s/^\./Di/" *
-n
Keine Aktion: Namen der umzubenennenden Dateien drucken, aber nicht umbenennen.
/^\./
^
Position am Anfang der Zeichenfolge behaupten\.
.
entspricht wörtlich dem Charakter
shopt -s dotglob
undshopt -u dotglob
shopt
shopt [-pqsu] [-o] [optname …]
Schalten Sie die Werte der Einstellungen um, die das optionale Shell-Verhalten steuern.
-s
Aktivieren (festlegen) Sie jeden Optionsnamen.
-u
Deaktivieren (aufheben) Sie jeden Optionsnamen.
dotglob
Wenn festgelegt, schließt Bash Dateinamen, die mit einem beginnen,
.
in die Ergebnisse der Dateinamenerweiterung ein.
Beispiel
$ ls -oag
total 88
drwxrwxr-x 2 4096 Jul 17 17:16 .
drwxr-xr-x 226 86016 Jul 17 17:13 ..
-rw-rw-r-- 1 0 Jul 17 17:16 .foo
$ rename "s/^\./Di/" *
$ ls -oag
total 88
drwxrwxr-x 2 4096 Jul 17 17:16 .
drwxr-xr-x 226 86016 Jul 17 17:13 ..
-rw-rw-r-- 1 0 Jul 17 17:16 Difoo
Ich bin nicht sicher, was du damit meinst
Gibt es eine Möglichkeit, den "." wieder in die Anfangsbuchstaben jedes Dateinamens zu ändern?
Meinst du so etwas?
.zzyGir
->zzzzGir
Wenn ja, verwenden Sie diese Befehle in einer Bash:
shopt -s dotglob
rename -n 's/^\.(..)(.*)/$1$1$2/' *
Überprüfen Sie die Ergebnisse und benennen Sie sie mit
rename 's/^\.(..)(.*)/$1$1$2/' *
Und endlich wieder
shopt -s dotglob
Antwort2
So wie ich es verstehe, haben Sie einen Ordner mit Dateien wie den folgenden:
ls -la
drwxrwxr-x 2 ron ron 4096 Jul 17 20:50 .
drwxrwxr-x 3 ron ron 4096 Jul 17 20:47 ..
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .abc
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .Gyr
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .hig123
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 .zyz
und Sie möchten es .
aus allen Dateinamen entfernen, um es zu erstellen:
abc
Gyr
hig123
zyz
Hierfür können Sie find
Folgendes verwenden rename
:
find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;
Der obige Befehl (also mit dem -n
) ist ein Probelauf:
find . ! -path . -type f -name ".*" -exec rename -n "s/.\/.//" {} \;
rename(./.zyz, zyz)
rename(./.abc, abc)
rename(./.Gyr, Gyr)
rename(./.hig123, hig123)
Führen Sie es aus, ohne -n
die Dateinamen tatsächlich zu ändern:
find . ! -path . -type f -name ".*" -exec rename "s/.\/.//" {} \;
ls -la
total 8
drwxrwxr-x 2 ron ron 4096 Jul 17 20:59 .
drwxrwxr-x 3 ron ron 4096 Jul 17 20:47 ..
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 abc
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 Gyr
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 hig123
-rw-rw-r-- 1 ron ron 0 Jul 17 20:47 zyz