2017-05-24 4 views
0

Je ces fichiers:Renommer des fichiers en gardant successivement la première partie du nom

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 

Et je voudrais renommer comme ceci:

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 

J'ai essayé ce qui suit (et quelques variations) mais nous avons eu aucun succès:

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

et

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

et

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

Le plus proche je suis arrivé utilisait la dernière qui m'a donné comme:

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

Je suis sûr que je peux le faire en utilisant python, mais je suis en train via la ligne de commande/bash et de préférence en utilisant regex (que j'essaie d'apprendre mieux).

+1

Cela semble incrémenter les nombres de un, mais la réponse acceptée ne le fait pas. Quel est le comportement désiré vraiment? –

+0

@Benjamin W.J'ai expliqué ce que je voulais en question et j'ai même posté un exemple de la sortie désirée. La dernière chose que j'ai dite était d'illustrer ce que j'ai obtenu ce n'était pas ce que je voulais. –

+1

Oui, selon le résultat souhaité dans la question, la numérotation passe de 0,1,2,3,4 à 1,2,3,4,5, mais la réponse acceptée correspond directement. –

Répondre

2

Créer le nouveau nom avec sed, l'enregistrement des sections du nom de fichier et les échanger:

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 

Pour plus de sécurité, je mets dans l'écho devant le mv. Si les résultats semblent bons, retirez l'écho. Voici mes résultats:

[[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

Une façon vous pouvez le faire est en utilisant la substitution de paramètres bash:

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

La variable d se prépare au dernier chiffre dans le nom de fichier, puis le remplace dans la mv.

+0

Le nombre ne s'incrémente pas ici, n'est-ce pas? –

+0

@BenjaminW .: Non, il utilise celui du nom de fichier. –

+0

Mais il devrait être incrémenté, si vous regardez les noms désirés. –

1

Bash expressions régulières:

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

Le echo peut être retiré lorsque la sortie semble correcte.

Si l'objectif est de ne pas incremenent le numéro de fichier d'entrée, mais ont des fichiers numérotés de manière séquentielle à partir de 1, le code peut être changé à ce qui suit:

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

Maintenant, les fichiers seront numérotés de 1, 2 , 3, ... dans l'ordre de saisie alphabétique.

0

non testé Je ne suis pas à un ordinateur, mais en fonction de vos propres efforts avec rename, cela devrait être proche:

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

Le split devrait mettre tout avant « .csv. » en $a et tout après en $b. La deuxième partie définit la sortie ($_) sur $a suivi de $b+1 avec ".csv" ajouté.