2017-12-21 24 views
0

Ich habe etwa 7.000. TXT-Dateien, die von einem Programm ausgespuckt wurden, wo die Namenskonvention deutlich brach. Die einzige Rettung ist, dass sie der folgenden Struktur folgen: ID, Datum, Uhrzeit.Wie kann man Dateinamen formatieren und umbenennen?

m031060209104704.txt -> id: m031 Datum: 060209 Zeit: 104704 .txt

Beispiel von anderen Dateinamen (wieder gleiche):

115-060202105710.txt -> id: 115- Datum: 060202 Zeit: 105710 .txt

x138051203125338.txt etc ...

9756060201194530.txt etc ..

Ich möchte alle 7.000 Dateien in diesem Verzeichnis umbenennen zu sehen wie folgt aus:

m031060209104704.txt ->090206_104704_m031 .txt

dh date_time_id (jeweils von Unterstrichen getrennt oder Bindestriche, I nichts dagegen). Ich brauche das Datumsformat von yymmdd zu ddmmyy, wie direkt oben gezeigt!

Ich bin nicht klar, was Overkill hier ist, vollständige Programm-Skript oder Bash-Befehl (MAC OS). Auch hier ist es mir egal, jede und jede Hilfe wird geschätzt.

+1

Was ist die Frage? – Roadowl

+1

Haben Sie überhaupt etwas versucht? – Inian

+0

Was haben Sie versucht? Es gibt viele Beispiele für ähnliche Dateiumbenennungen hier auf Stackoverflow.com. –

Antwort

3

Versuchen Sie so etwas wie:

#!/bin/bash 

# directory to store renamed files 
newdir="./renamed" 
mkdir -p $newdir 

for file in *.txt; do 
    if [[ $file =~ ^(....)([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{6})\.txt$ ]]; then 
     # extract parameters 
     id=${BASH_REMATCH[1]} 
     yy=${BASH_REMATCH[2]} 
     mm=${BASH_REMATCH[3]} 
     dd=${BASH_REMATCH[4]} 
     time=${BASH_REMATCH[5]} 

     # then rearrange them to new name 
     newname=${dd}${mm}${yy}_${time}_${id}.txt 

     # move to new directory 
     mv "$file" "$newdir/$newname" 
    fi 
done 
+0

Arbeitete perfekt für das, was ich brauchte, auch viel einfacher zu verstehen als die 'sed' und Regex's, die ich vor ein paar Stunden versuchte! Vielen Dank – Abbie

3

Bash String-Indizes macht es sehr einfach und effizient die Dateinamen zu überarbeiten, wie Sie möchten. Sie sollten auch überprüfen, dass Sie nur mit Eingabedateinamen von 20 Zeichen arbeiten. Das kann wie folgt erreicht werden:

#!/bin/bash 

for i in *.txt; do 
    ## validate a 20 character filename 
    ((${#i} == 20)) || { printf "invalid length '%s'\n" "$i"; continue; } 
    echo "mv $i ${i:8:2}${i:6:2}${i:4:2}_${i:10:6}_${i:0:4}.txt" ## output rename 
    mv "$i" "${i:8:2}${i:6:2}${i:4:2}_${i:10:6}_${i:0:4}.txt" ## actual rename 
done 

Beispiel Verzeichnis

$ ls -l 
total 0 
-rw-r--r-- 1 david david 0 Dec 21 19:16 115-060202105710.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:16 9756060201194530.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:15 m031060209104704.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:16 x138051203125338.txt 

Beispiel Verwendung/Output

$ cd thedir 
$ bash ../script.sh 
mv 115-060202105710.txt 020206_105710_115-.txt 
mv 9756060201194530.txt 010206_194530_9756.txt 
mv m031060209104704.txt 090206_104704_m031.txt 
mv x138051203125338.txt 031205_125338_x138.txt 

$ ls -l 
total 0 
-rw-r--r-- 1 david david 0 Dec 21 19:42 010206_194530_9756.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:42 020206_105710_115-.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:42 031205_125338_x138.txt 
-rw-r--r-- 1 david david 0 Dec 21 19:42 090206_104704_m031.txt 

Blick über Dinge und lassen Sie mich wissen, wenn Sie weitere haben Fragen.

+1

Ahh ... Gotcha, festhalten ':)' –

Verwandte Themen