[gelöst] bash Teil eines Dateinamen umbenennen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Marmor626
Beiträge: 24
Registriert: 24.01.2010 08:54:41

[gelöst] bash Teil eines Dateinamen umbenennen

Beitrag von Marmor626 » 12.11.2013 16:07:15

Hallo zusammen.

Ich habe hier schon gesucht und auch viele Ansätze gefunden, aber leider bekomme ich mein "Endprodukt"-Produkt nicht hin.
Ich habe in einem Verzeichnis 5 Ordner.

Code: Alles auswählen

05-131104
04-131105
03-131106
02-131107
01-131108
Im skript lösche ich nun das Verzeichnis "05*" und möchte, dass das Verzeichnis "04-131105" zu "05-131105" wird ; das Verzeichnis "03-131106" zu "04-131106" usw.

Grundsätzlich kann ich einen String mit cat oder sed zerlegen.
Ich weiß auch dass man mit "for in $Files" ein Verzeichnis z.B.: durchforsten kann, aber irgendwie bekomme ich es nicht gebacken.

Zuerst habe ich es versucht einzeln (Verzeichnis für Verzeichnis) abzuarbeiten, da es ja nur 5 Verzeichnisse sind. Aber da scheitere ich am Auslesen des Dateinamens, denn ein "ls 04*" funktioniert nicht (sorry für meine Unwissenheit - aber ein Versuch war´s wert ...)

Mit der Schleife lese ich zwar die Verzeichnisnamen aus, aber dafür stolper ich in der Namensbearbeitung. Speziell bei der Nummerierung am Anfang der Dateinamen.

Wäre echt toll, wenn mich jemand in die richtige Richtung schuppsen könnte.

Danke schon mal im Voraus.

Gruß
Robert
Zuletzt geändert von Marmor626 am 20.11.2013 09:46:21, insgesamt 1-mal geändert.

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: bash Teil eines Dateinamen umbenennen

Beitrag von uname » 12.11.2013 16:34:38

Leider weiß ich nicht was du erreichen willst. Aber um z.B. 5 Backup-Generationen zu verwalten würde ich vor den Backups keine Nummern schreiben, sondern immer nur das Datum nutzen, welches ja nach Defintion immer korrekt sortiert ist. Dann noch umgekehrt sortiert (ls -r) , mit Nummerierung versehen (nl) und dann noch einmal umsortieren (tac). Fertig.

Code: Alles auswählen

 
ls
131105  131106  131107  131108  131109

Code: Alles auswählen

 
ls -r |tr ' ' '\n'|nl|tac
     5  131105
     4  131106
     3  131107
     2  131108
     1  131109

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash Teil eines Dateinamen umbenennen

Beitrag von Cae » 13.11.2013 01:38:49

Was funktionieren koennte:

Code: Alles auswählen

rm -r 05-*

old=05;
for f in 04-* 03-* 02-* 01-*; do
	mv "$f" "$old-${f#*-}";
	old="${f%%-*}";
done
Das geht kaputt, sobald es mehrere Dateien mit demselben Praefix gibt, z.B. 01-foo und 01-bar. Ansonsten schnippelt man sich jeweils die eine Haelfte vom Namen weg, ${f#*-} nimmt den rechten Teil vom ersten - aus gesehn und ${f%%-*} den linken (also das 0?-Praefix).

Moeglicherweise ist es einfacher, sich eine Liste aller angelegten Ordner zu schreiben und regelmaessig alle bis auf die untersten fuenf wegzuloeschen. Dann kann man sich das Praefix sparen. Zur Demonstration:

Code: Alles auswählen

$ seq 15 | xargs              # alle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$ seq 15 | head -n -5 | xargs # loeschen
1 2 3 4 5 6 7 8 9 10
$ seq 15 | tail -n 5 | xargs  # behalten
11 12 13 14 15
$ 
Im Skript dann sowas wie

Code: Alles auswählen

newdir="$(date +%F | tr -d -)"

mkdir "$newdir";
cp -a "/folder/to/backup" "$newdir";

echo "$newdir" >>db;
head -n -5 db | xargs rm -r; # alle bis auf die letzten fuenf loeschen
tail -n 5 db >db.tmp;        # db auf die letzten fuenf reduzieren
mv db.tmp db;
Guck' aber vorher nochmal, was das wirklich macht, ich hab's nicht vollstaendig getestet.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: bash Teil eines Dateinamen umbenennen

Beitrag von roli » 13.11.2013 08:58:31

Hi,

ich kann's grade nicht ausprobieren, aber ich meine das "mmv" das können sollte.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash Teil eines Dateinamen umbenennen

Beitrag von Cae » 13.11.2013 19:30:52

roli hat geschrieben:ich kann's grade nicht ausprobieren [...]
Tipp: Online-Online-Handbuecher [1] wie manpages.debian.net [2].

Gruss Cae

[1] nein, kein Tippfehler, "manpages" ist schon die "online documentation" auf der laufenden Maschine selbst, aber nicht "online" im Netz.
[2] http://manpages.debian.net/cgi-bin/man.cgi?query=mmv
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Marmor626
Beiträge: 24
Registriert: 24.01.2010 08:54:41

Re: bash Teil eines Dateinamen umbenennen

Beitrag von Marmor626 » 20.11.2013 09:45:59

Hallo

Sorry für die späte Antwort, aber ich war in den letzten Tagen kurzfristig im Lande.

Im Grunde ist der Hinweis von uname der einfachste.
Ich müsste ja nur das Datum als Ordnername nehmen und halt sicherstellen, dass nur das älteste Verzeichnis gelöscht wird.
(z.B.: mit

Code: Alles auswählen

rm -ir $(for i in `ls -t` ; do find /<Pfad>/ -maxdepth 1 -name $i -type d ; done | tail -1)
)
Damit habe ich die ganze Namenumbenennerei erledigt.

Danke an alle für die Tipps.

Gruß
Robert

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: [gelöst] bash Teil eines Dateinamen umbenennen

Beitrag von uname » 20.11.2013 16:00:55

Im Grunde ist der Hinweis von uname der einfachste.
Also ganz ist das nicht mein Vorschlag. Du löscht jetzt ja den ältesten Ordner, den du über "ls -t" ermittelst. Wenn das Verhalten deinen Vorstellungen entspricht ist das gut, das kann aber auch mal danebengehen, wenn du manuell was änderst. Mein Vorschlag ging eher dahin den Ordner gleich entsprechend nach dem Datum zu benennen und dann den Ordner mit dem "geringsten" Namen zu löschen. In dem Fall führt eine manuelle Änderung im Ordner und damit eine Datumänderung nicht zu einem anderen Verhalten.

Marmor626
Beiträge: 24
Registriert: 24.01.2010 08:54:41

Re: [gelöst] bash Teil eines Dateinamen umbenennen

Beitrag von Marmor626 » 20.11.2013 18:03:54

Hallo uname.

Wow, bist Du schnell.

Du hast natürlich Recht.
Auf die Sache mit dem "Systemdatum" bin ich gekommen, da ich mir dann nicht die Arbeit mit den Verzeichnisnamen machen brauche.
Aber "fremdgenerierte Schlüssel" unterliegen auch anderen Einflüssen.
In diesem Fall: ein vom system erzeugter Zeitstempel kann bei unvorsichtigen Gebrauch auch vom System wieder verändert werden
Ein selbst vergebener Dateiname (oder Verzeichnisname) wird tendenziell eher nicht vom System einfach geändert.

In meinem Fall syncronisiere ich 1x wöchentlich Daten aus meinem Webspace auf ein Verzeichnis meines Servers zuhause.
Um eine Historie zu bekommen verhardlinke ich das Backupverzeichnis in ein anderes Verzeichnis und syncronisiere dann das Backupverzeichnis erneut. Insgesamt 5x Verzeichnisse mit Hardlnks - also 5fache Historie.
Da ich die gebackupten Daten nicht brauche, kann sich auch das Datum nicht ändern.

Du hast aber Recht mit Deinem Hinweis, dass ich durch evtl unbeabsichtigte Aktionen das Datum einer Datei im Backup verändern, und dann evtl der falsche "Hitorien-Ordner" durch mein Skript gelöscht werden kann.

Dieser Hinweis von Dir ist wirklich wichtig.

Danke, dass Du dich nochmal auf meinen "glöst"-Post gemeldet hast.

Respektvoller Gruß
Robert Kraus

Antworten