Nach Muster von Dateien, diese hochzählen
Hallo zusammen,
die führenden Nullen-Aufgabe von heute morgen habe ich so gelöst:
#!/bin/sh
x=1
for fname in /Verzeichnis/*.abc
do
cp $fname `printf $fname."%04d" $x`
x=$(($x+1))
done
Danke für eure Unterstützung.
Leider habe ich die Geschichte zu früh auf gelöst markiert, da ich nochmal vor einer Herausforderung stehe.
In der o.g. Lösung wird hinter jede gefundene Datei eine fortlaufende 4stellige Zahl beginnend mit 1 angehängt.
/Verzeichnis/0055788.1241abc.0001
/Verzeichnis/0055788.8234abc.0002
/Verzeichnis/0055788.8235abc.0003
/Verzeichnis/0065788.8235abc.0004
/Verzeichnis/0355788.8235abc.0005
/Verzeichnis/0355788.8235abc.0006
/Verzeichnis/0355788.8235abc.0007
aber
ich würde gerne nur dann die Zahl hinten hochzählen lassen, wenn die ersten 7 Zeichen bis zum Punkt identisch sind. Dann wieder bei 1 beginnend. Im Ergebnis dann so...
/Verzeichnis/0055788.1241abc.0001
/Verzeichnis/0055788.8234abc.0002
/Verzeichnis/0055788.8235abc.0003
/Verzeichnis/0065788.8235abc.0001
/Verzeichnis/0355788.8235abc.0001
/Verzeichnis/0355788.8235abc.0002
/Verzeichnis/0355788.8235abc.0003
Merci für Anregungen, Erik
die führenden Nullen-Aufgabe von heute morgen habe ich so gelöst:
#!/bin/sh
x=1
for fname in /Verzeichnis/*.abc
do
cp $fname `printf $fname."%04d" $x`
x=$(($x+1))
done
Danke für eure Unterstützung.
Leider habe ich die Geschichte zu früh auf gelöst markiert, da ich nochmal vor einer Herausforderung stehe.
In der o.g. Lösung wird hinter jede gefundene Datei eine fortlaufende 4stellige Zahl beginnend mit 1 angehängt.
/Verzeichnis/0055788.1241abc.0001
/Verzeichnis/0055788.8234abc.0002
/Verzeichnis/0055788.8235abc.0003
/Verzeichnis/0065788.8235abc.0004
/Verzeichnis/0355788.8235abc.0005
/Verzeichnis/0355788.8235abc.0006
/Verzeichnis/0355788.8235abc.0007
aber
ich würde gerne nur dann die Zahl hinten hochzählen lassen, wenn die ersten 7 Zeichen bis zum Punkt identisch sind. Dann wieder bei 1 beginnend. Im Ergebnis dann so...
/Verzeichnis/0055788.1241abc.0001
/Verzeichnis/0055788.8234abc.0002
/Verzeichnis/0055788.8235abc.0003
/Verzeichnis/0065788.8235abc.0001
/Verzeichnis/0355788.8235abc.0001
/Verzeichnis/0355788.8235abc.0002
/Verzeichnis/0355788.8235abc.0003
Merci für Anregungen, Erik
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 332752
Url: https://administrator.de/forum/nach-muster-von-dateien-diese-hochzaehlen-332752.html
Ausgedruckt am: 18.04.2025 um 05:04 Uhr
12 Kommentare
Neuester Kommentar
Servus Erik,
z.B. so
Grüße Uwe
z.B. so
#!/bin/sh
OIFS=$IFS
# separator auf newline ändern
IFS=$'\n'
# Nummern nach Vorgabe gruppieren und darüber itterieren
for n in $(for f in $(ls -1 *abc);do echo "${f%%.*}";done | sort --unique) ;do
# Neue Gruppe: Counter auf 1 setzen
cnt=1
# Alle Dateien der Gruppe listen und mit Counter versehen
for f in $(ls -1 ${n}.*abc);do
mv "$f" "${f}.$(printf %04d $cnt)"
cnt=$(($cnt+1))
done
done
# separator zurücksetzen
IFS=$OIFS
Zitat von @Erik72:
Hallo Uwe,
das sieht gut aus, aber wie definiere ich die Gruppierung nach den bestimmten 7 Zeichen im Dateinamen, welche immer an Stelle 14 beginnen und bis Stelle 20 gehen?
Gruß, Erik
Das geschieht in Zeile 6, dort wird mitHallo Uwe,
das sieht gut aus, aber wie definiere ich die Gruppierung nach den bestimmten 7 Zeichen im Dateinamen, welche immer an Stelle 14 beginnen und bis Stelle 20 gehen?
Gruß, Erik
${f%%.*}
Du kannst dort stattdessen auch mit Index arbeiten
${f:13:7}
http://tldp.org/LDP/abs/html/string-manipulation.html
Natürlich darfst du dann nicht vergessen das nächste Dateilisting in der zweiten FOR-Schleife anzupassen so das es auf den Dateinamen passt (Zeile 10)!!
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen, und Lösungen markieren. Merci.
Erst einmal gibt es hier Verwirrung von deiner Seite. Du schreibst :
Wenn es --unique nicht will nimm -u. Skript wurde hier einwandfrei auf einem Ubuntu 14.04LTS getestet. Nach dem Schema wie du es in deinem ersten Post geschildert hast. Das heißt alles vor dem ersten Punkt im Dateinamen wird zur Gruppierung herangezogen und dann die Dateien jeweils von 1-X hochnummeriert.
Hast du nun andere Anforderungen musst du diese hier ordentlich unmissverständlich schildern
wir können hier ja nicht hellsehen. Merci.
Im Verzeichnis sind folgende Dateien (3 Typen):
0055788.1241abc
0055788.8234abc
0055788.8235abc
und weiter oben schreibst du0055788.1241abc
0055788.8234abc
0055788.8235abc
welche immer an Stelle 14 beginnen und bis Stelle 20 gehen?
das passt leider überhaupt nicht zusammen da deine Dateinamen diese Länge nicht haben!!Mein sort in Zeile 6 meckert:
Welches Linux-Derivat (Umgebung)?Wenn es --unique nicht will nimm -u. Skript wurde hier einwandfrei auf einem Ubuntu 14.04LTS getestet. Nach dem Schema wie du es in deinem ersten Post geschildert hast. Das heißt alles vor dem ersten Punkt im Dateinamen wird zur Gruppierung herangezogen und dann die Dateien jeweils von 1-X hochnummeriert.
Hast du nun andere Anforderungen musst du diese hier ordentlich unmissverständlich schildern
Jetzt will der mover nicht. Das ist mir zu kompliziert. Hast du noch eine Idee?
Ja klar, das Skript oben geht davon aus das du dich im Verzeichnis befindest in dem die Dateien liegen.Das kannst du aber anpassen indem die den Ordner vor die Variable $f schreibst:
mv "/deinOrdner/$f" "/deinOrdner/${f}.$(printf %04d $cnt)"
Wie gesagt läuft hier einwandfrei.
Hier noch eine Variante bei der du den Ordner in eine Variable schreibst:
Geht ebenfalls problemlos.
Hier noch eine Variante bei der du den Ordner in eine Variable schreibst:
#!/bin/sh
folder="/path/to/files"
for n in $(for f in $folder/*abc ;do filename=$(basename "$f");echo "${filename%%.*}";done | sort -u);do
cnt=1
for f in $folder/${n}*abc ;do
mv "$f" "${f}_$(printf %04d $cnt)"
cnt=$(($cnt+1))
done
done
HP-UX 11
Oh jeh ... da kann ich nichts zu sagen. Da bin ich raus.${filename:11:10}": The specified substitution is not valid for this command.
Das wird die reine Posix-Shell nicht fressen, die ist da etwas begrenzt in Ihrem Funktionsumfang.Du kannst aber stattdessen auch cut benutzen:
for n in $(for f in $folder/*abc ;do filename=$(basename "$f");echo "$filename" | cut -d '_' -f2;done | sort -u);do
for n in $(for f in $folder/*abc ;do filename=$(basename "$f");echo "$filename" | sed -re 's/^[^_]+_([^_]+).*/\1/i';done | sort -u);do
for f in $folder/*_${n}_*_*.abc ;do
Den Beitrag dann bitte noch auf gelöst setzen, und Lösungen markieren. Merci.
Grüße Uwe