2017-05-24 8 views
0

halten ich diese Dateien haben:nacheinander Umbenennen von Dateien Name ersten Teil

NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.0 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.1 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.2 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.3 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.4 

Und ich würde so benennen mag:

NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_1.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_2.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_3.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_4.csv 
NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_5.csv 

Ich habe die folgenden (und einige Varianten ausprobiert aber) bekam keinen Erfolg:

rename -v 's/(NIHMS.+tons).csv.+/\1_[0-9]\.csv/' *.csv* 

und

ls *csv* | sed -E 's/(NIHM.+tons)\.csv.*$/\1_{1..5}.csv/' 

und

ls *csv* | cat -n | while read n f; do mv "$f" "$f_$n.csv"; done 

Der nächstgelegene ich bekam, war die letzte verwenden, das hat mir gefallen:

1.csv 2.csv 3.csv 4.csv 5.csv 

Ich bin ziemlich sicher, ich diese Python tun, aber ich versuche, über die Befehlszeile/bash und vorzugsweise mit Regex (die ich versuche, besser zu lernen).

+1

Dies scheint die Zahlen um eins zu erhöhen, aber die akzeptierte Antwort nicht. Was ist das gewünschte Verhalten wirklich? –

+0

@ Benjamin W.Ich habe selbst erklärt was ich wollte und habe sogar ein Beispiel für die gewünschte Ausgabe gepostet. Das letzte, was ich gesagt habe, war zu veranschaulichen, was ich bekommen habe, was ich nicht wollte. –

+1

Ja, je nach der gewünschten Ausgabe in der Frage ändert sich die Nummerierung von 0,1,2,3,4 zu 1,2,3,4,5, aber die akzeptierte Antwort wird direkt zugeordnet. –

Antwort

2

Erstellen Sie den neuen Namen mit sed, Abschnitte der Dateinamen speichern und sie tauschen:

for file in *.csv.[0-9]*; do 
    new_name=$(echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/\1_\2.csv/') 
    echo mv $file $new_name 
done 

Zur Sicherheit habe ich in der Echo vor auf dem mv setzen. Wenn die Ergebnisse gut aussehen, nehmen Sie das Echo heraus. Hier sind meine Ergebnisse:

[[email protected] ~]$ for file in *.csv.[0-9]*; do new_name=$(echo $file | sed 's/\(.*\)\.csv\.\([0-9]*\)/\1_\2.csv/'); echo mv $file $new_name; done 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.0 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_0.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.1 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_1.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.10 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_10.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.11 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_11.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.2 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_2.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.3 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_3.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.4 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_4.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.5 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_5.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.6 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_6.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.7 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_7.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.8 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_8.csv 
mv NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons.csv.9 NIHMS735398-supplement-Supplemental_Table_-_Top_Down_MS_Identificaitons_9.csv 
[[email protected] ~]$ 
2

Eine Möglichkeit, dies ist die Substitution durch bash Parameter tun könnte:

for f in *.csv.* ; do d="${f##*.}" ; mv "$f" "${f%*.csv*}__$((d+1)).csv" ; done 

Die d Variable auf die letzte Stelle im Dateinamen gesetzt wird, dann ersetzt sie in der mv.

+0

Die Nummer wird hier nicht inkrementiert, oder? –

+0

@BenjaminW .: Nein, es verwendet die aus dem Dateinamen. –

+0

Aber es sollte erhöht werden, wenn Sie die gewünschten Namen betrachten. –

1

Mit Bash regulären Ausdrücken:

re='(.*)\.csv\.([[:digit:]]+)$' 
for f in *; do 
    [[ $f =~ $re ]] 
    echo mv "$f" "${BASH_REMATCH[1]}_$((${BASH_REMATCH[2]} + 1)).csv" 
done 

Die echo kann entfernt werden, wenn die Ausgabe korrekt zu sein scheint.

Wenn das Ziel ist nicht die Eingabedatei Nummer incremenent, haben aber sequentiell Dateien von 1 beginnend nummeriert, kann der Code wie folgt geändert werden:

re='(.*)\.csv\.[[:digit:]]+$' # Just one capture group 
i=1 
for f in *; do 
    [[ $f =~ $re ]] 
    echo mv "$f" "${BASH_REMATCH[1]}_$((i++)).csv" 
done 

Jetzt werden die Dateien 1, nummerieren 2 , 3, ... in alphabetischer Reihenfolge.

0

Ungeprüfte, wie ich bin nicht auf einem Computer, sondern auf der Grundlage Ihre eigenen Bemühungen mit rename, soll dies nahe: „.csv“

rename -n '($a,$b)=split /.csv./; $_=$a . ($b+1) . ".csv"' *csv* 

Die split soll alles setzen vor in $a und alles danach in $b. Der zweite Teil setzt den Ausgang ($_) auf $a, gefolgt von $b+1 mit angehängtem ".csv".