erik72
Goto Top

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

Content-Key: 332752

Url: https://administrator.de/contentid/332752

Printed on: April 19, 2024 at 15:04 o'clock

Member: colinardo
colinardo Mar 21, 2017 updated at 12:29:51 (UTC)
Goto Top
Servus Erik,
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
Grüße Uwe
Member: Erik72
Erik72 Mar 21, 2017 at 14:01:36 (UTC)
Goto Top
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
Member: colinardo
colinardo Mar 21, 2017 updated at 14:30:53 (UTC)
Goto Top
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 mit
${f%%.*}
alles vom Dateinamen von rechts bis zum letzten auftauchenden Punkt entfernt. So wie du oben im Post geschrieben hast.
Du kannst dort stattdessen auch mit Index arbeiten
${f:13:7}
Alle Möglichkeiten der String-Manipulation findest du hier
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)!!
Member: colinardo
colinardo Mar 24, 2017 updated at 09:38:27 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen nicht vergessen, und Lösungen markieren. Merci.
Member: Erik72
Erik72 Mar 24, 2017 at 10:53:36 (UTC)
Goto Top
Ich komme irgendwie nicht mehr weiter.
Mein sort in Zeile 6 meckert:

sort: illegal option -- -
sort: illegal option -- q
sort: illegal option -- e
Usage: sort [-AbcdfiMmnru] [-T Directory] [-tCharacter] [-y kilobytes] [-o File]
[-k Keydefinition].. [[+Position1][-Position2]].. [-z recsz] [File]..


Im Verzeichnis sind folgende Dateien (3 Typen):
0055788.1241abc
0055788.8234abc
0055788.8235abc
0065788.8235abc
0355788.3235abc
0355788.8235abc
Member: colinardo
colinardo Mar 24, 2017 updated at 11:02:47 (UTC)
Goto Top
Erst einmal gibt es hier Verwirrung von deiner Seite. Du schreibst :
Im Verzeichnis sind folgende Dateien (3 Typen):
0055788.1241abc
0055788.8234abc
0055788.8235abc
und weiter oben schreibst du
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 face-confused wir können hier ja nicht hellsehen. Merci.
Member: Erik72
Erik72 Mar 24, 2017 at 11:59:29 (UTC)
Goto Top
Tut mir leid für die Verwirrung mit den Dateienamen
Ich hab ein HP-UX 11 laufen.

Mit den 3 Typen sind die ersten 7 Zeichen gemeint (Asche auf mein Haupt)

Gruppierung nach
0055788
0065788
0355788
im Dateinamen

sort -u funktioniert !
Jetzt will der mover nicht. Das ist mir zu kompliziert. Hast du noch eine Idee?

Ausgabe:
mv: 0055788.1241abc
0055788.8234abc
0055788.8235abc: cannot access: No such file or directory
Member: colinardo
Solution colinardo Mar 24, 2017 updated at 12:03:32 (UTC)
Goto Top
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)" 
Member: Erik72
Erik72 Mar 24, 2017 at 12:12:52 (UTC)
Goto Top
Das Skript befindet sich schon im gleichen Verzeichnis. Ich kann auch am Anfang ein cd ins Verzeichnis einfügen oder deinen Vorschlag anwenden.

Wenn ich die " weglasse, gleiches Ergebnis
Irgendwie komisch
Member: colinardo
Solution colinardo Mar 24, 2017 updated at 14:53:40 (UTC)
Goto Top
Wie gesagt läuft hier einwandfrei.

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
Geht ebenfalls problemlos.

HP-UX 11
Oh jeh ... da kann ich nichts zu sagen. Da bin ich raus.
Member: Erik72
Erik72 Mar 27, 2017 updated at 13:39:14 (UTC)
Goto Top
Jaaaaa, das funktioniert! DANKE! DANKE! DANKE!

Nur noch eine Frage bei Abänderung der Dateinamen im Verzeichnis
Wenn die Dateien nun nach folgendem Muster im Verzeichnis liegen:

AB5000TJO_xxxxxxxx_0063464343_20180112.abc

Wie gruppiere ich nach den gleichen xxxxxxxxxx ?
Ich müsste doch dem sort irgendwie mitteilen, dass er nach dem ersten _ die xxxxxxxx gruppiert?
Mein Versuch ab Stelle 11 für 10 Zeichen zu gruppieren

for n in $(for f in $folder/*abc ;do filename=$(basename "$f");echo "${filename:11:10}";done | sort -u);do

scheitert...
${filename:11:10}": The specified substitution is not valid for this command.

Vielen Dank für eure Anregungen
Member: colinardo
Solution colinardo Mar 27, 2017 updated at 17:17:38 (UTC)
Goto Top
${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  
Alternativ hier auch noch eine Variante mit sed
for n in $(for f in $folder/*abc ;do filename=$(basename "$f");echo "$filename" | sed -re 's/^[^_]+_([^_]+).*/\1/i';done | sort -u);do  
Und dann in Zeile 6 nicht vergessen den Pattern anzupassen:
for f in $folder/*_${n}_*_*.abc ;do 


Den Beitrag dann bitte noch auf gelöst setzen, und Lösungen markieren. Merci.

Grüße Uwe