Ordner erstellen anhand eines Dateinames

  • Ersteller rosaroterPanthe
  • Erstellt am
R

rosaroterPanthe

Grünschnabel
Hallo Leute,

ich bin ein absoluter neuling und kämpfe gerade mit einem kleinen Problem...
Ich möchte ein shell-script schreiben das mir hilft Dateien zu sortieren.
in jedem Dateinamen ist ein Datum enthalten.
die Dateinamen haben immer die selbe länge.
z.b. "abcde071206xyz.abc"
Jetzt möchte ich das dem Datum im dateiname entsprechend ein Ordner erstellt wird und die Dateien dem ensprechend in den passenden Ordner kopiert werden...


hat jemand eine idee?
wäre für hilfe sehr dankbar!

grüße
 
Hallo Leute,

ich bin ein absoluter neuling und kämpfe gerade mit einem kleinen Problem...
Ich möchte ein shell-script schreiben das mir hilft Dateien zu sortieren.
in jedem Dateinamen ist ein Datum enthalten.
die Dateinamen haben immer die selbe länge.
z.b. "abcde071206xyz.abc"
Jetzt möchte ich das dem Datum im dateiname entsprechend ein Ordner erstellt wird und die Dateien dem ensprechend in den passenden Ordner kopiert werden...


hat jemand eine idee?
wäre für hilfe sehr dankbar!

grüße

Schnellschuß:

Alle Dateien seien in einem Verzeichnis in dieser Form
Code:
for a in *;
do
newdir=/path/${a//[!0-9]/};
if [ ! -d $newdir ];
then
mkdir $newdir
fi
if [ ! ${newdir}/$a ];
then
cp $a $newdir;
else
echo "${newdir}/$a existiert schon!"
fi
done

Entsprechend anpassen.

Gruß Wolfgang
 
Hallo Wolfgang,
Danke,
ist soiweit auch ein guter ansatz und ich verstehe beinahe alles :-)
jetzt hab ich nur noch das problem das das datum im dateinamen nicht die einzigen zahlen sind.
ich brauch quasi als $newdir eine bestimmte possition im dateinamen...
komme damit aber nicht wirklich weiter... hast mir ein schlagwort wonsch ich da suchen kann um das prob zu lösen?
auch das "cp" funktioniert noch nicht...
vielleicht kannst du mir nochmal einen denkanstoss verpassen :-)

danke für deine hilfe
 
Wenn das Datum immer an der gleichen Stelle ist, kannst Du es mit der '-f' option zu 'cut' ausschneiden und weiterverwenden.
 
Wenn das Datum immer an der gleichen Stelle ist, kannst Du es mit der '-f' option zu 'cut' ausschneiden und weiterverwenden.

les mich gerade in cut ein...
wie bring ich das in das oben genannte script rein?
Merci
 
Hallo,

ich glaube cut -c wäre eher die richtige Wahl.

Wenn das datum immer ab der 6ten Stelle losgeht wäre das datum mit
cut -c 6-11 (bei zweistelliger Jahreszahl ) rauszuholen.
Die Hochkommas führen übrigens dazu, dass das was darin enthalten ist ausgeführt wird und die Ausgabe davon wird dann an die stelle des in den
Hochkommas eingerahmten Abschnitts gesetzt.

for a in *;
do
newdir=/path/`echo $a | cut -c 6-11`;
if [ ! -d $newdir ];
then
mkdir $newdir
fi
if [ ! ${newdir}/$a ];
then
cp $a $newdir;
else
echo "${newdir}/$a existiert schon!"
fi
done

Ich hoffe das hilft dir weiter
 
Danke,

bin schon mal ein schritt weiter... aber ich glaube das überfordert mich noch ein wenig :-)
die Ordner werden jetzt erstellt... allerdings funktioniert das kopieren noch nicht...
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Fehler bei kopieren lag daran das noch ein "-f" gesetzt werden muss da es sich um eine Datei handelt...
if ! [ -f ${newdir}/$a ];

theoretisch geht es jetzt... wenn nicht gerade ein Kollege beschlossen hätte das die Dateien doch nicht einheitlich lang sind... es div. um eine Stelle...
:devil:
ist es möglich mit cut -c von hinten (123.abc, also von c, b,a) zu zählen?
:think:
bzw hat schon jemand mit awk gearbeitet?

gruß
 
Zuletzt bearbeitet:
Hallo

Du kannst das nicht mit cut allein hinbekommen.
Allerdings kannst du mit rev die Zeichenkette umdrehen und bearbeiten, und am Ende wieder umdrehen.

Code:
a=1234567;
$ echo $a|rev|cut -c 1-5|rev
34567

Um die letzten drei Zeichen wegzulassen geht in der bash/ksh auch dieses:
Code:
a=1234567;
echo ${a%???};
1234

Wenn du ein zuverlässiges Muster hast, geht das sicher auch mit anderen Mitteln.
Ich bin allerdings von deinem Beispiel ausgegangen.

Und ja, das fehlende f ist natürlich ein Fipptehler von mir.
;)

Gruß Wolfgang
 
Danke!!! das war die lösung!!! werde nach meinem urlaub die komplette lösung noch posten :-)

guten rutsch euch allen


so hier meine lösung...


for a in /pfad/archiv/*.*;
do

# den ordner erstellen
newdir=$archiv/`echo $a |rev|cut -c 11-16|rev`
mkdir -p $newdir

# sortieren

if [ `find $a -name 'XYZ*' | wc -l` != 0 ]
then echo "files werden archiviert"
mkdir -p $newdir/folder
find $a -name 'XYZ*' -exec mv {} $newdir/folder \;
else echo "file gehoert nicht dazu"
fi
 
Zuletzt bearbeitet:

Ähnliche Themen

Verzeichnis mit 1200 Dateien auf Verweise in Textdateien checken

Shell Skript zum automatischen Aufräumen von doppelten Ordnern

Cronjob um Dateien und Ordner die älter als 7 Tage sind löschen

Shell Script zur Stapelverarbeitung von Bildern

Dateinamen als laufende Parameter

Zurück
Oben