2010-02-25 3 views
1

J'ai une structure de répertoire qui ressemble à ceci:nombre Append aux noms de fichiers lors aplanissement structure de répertoires sur Linux

/a/f.xml 
/b/f.xml 
/c/f.xml 
/d/f.xml 

Ce que je veux faire est de copier tous les fichiers XML dans un répertoire comme celui-ci:

/e/f_0.xml 
/e/f_1.xml 
/e/f_2.xml 
/e/f_3.xml 

Comment puis-je faire cela efficacement sur le shell Linux?

+1

Voulez-vous ajouter toujours un numéro, ou seulement si les fichiers autrement seraient en conflit? Êtes-vous engagé dans un script shell, ou est-ce qu'un langage de script Perl, Python ou similaire est acceptable? (Si non, est-ce que bash est bien ou seulement POSIX sh?) –

+0

Désolé, cela aurait dû être plus clair: Chaque sous-répertoire contient les mêmes noms de fichiers, donc oui, le numéro devrait être ajouté à chaque fichier. J'espérais une solution de script shell pur, mais id ne doit pas être seulement POSIX, donc bash serait bien, aussi. – Florian

Répondre

1
let count=0 
for file in $(ls $dir) 
do 
mv $file $newdir/${file%%.*}_$count.${file##*.} 
let count=count+1 
done 
+0

@ennuikiller: c'est cool ... ne devrait-il pas être récursif pour choisir le * .xml ... ?? +1 de moi: D – t0mm13b

+0

pourquoi ne pas utiliser quelque chose comme 'trouver $ dir -type f -name" * .xml "' à la place de 'ls $ dir'? – jschmier

+0

N'utilisez pas 'ls' et vous ne devriez pas utiliser' for' non plus. Pipe 'find' dans' while'. En outre, cela ne se répète pas dans les répertoires sources et il récupère tous les fichiers plutôt que seulement les fichiers xml. –

0
#!/bin/bash 
COUNTER=0; 
for i in */f.xml; 
do 
    BASE=`expr "$i" : '.*/\(.*\)\..*'`; 
    EXT=`expr "$i" : '.*/.*\.\(.*\)'`; 
    mv "$i" e/"$BASE"_"$COUNTER"."$EXT"; 
    COUNTER=`expr $COUNTER + 1` 
done; 
0
#!/bin/bash 
for file in /{a,b,c,d}/f.xml 
do 
    name=${file##*/} 
    name=${name%.xml} 
    ((i++)) 
    echo mv "$file" "/destination/${name}_${i}.xml" 
done 

bash 4.0 (pour récursive)

shopt -s globstar 
for file in /path/**/f.xml 
do 
    name=${file##*/} 
    name=${name%.xml} 
    ((i++)) 
    echo mv "$file" "/destination/${name}_${i}.xml" 
done 
Questions connexes