2 votes

Shell scripting : itération dans les répertoires et déplacement/renommage des fichiers.

(Pour information, j'ai très peu de connaissances en matière de scripts Shell)

J'ai une tonne de fichiers et de répertoires qui ressemblent à quelque chose comme

-root
 -dir1/a.txt
 -dir2/a.txt
 -dir3/b.txt
 -dir4/b.txt
 -dir5/c.txt

J'aimerais pouvoir combiner/concaténer tous les fichiers ayant le même nom de fichier, puis mettre le tout dans la racine. Le résultat final ressemblerait donc à

-root/a.txt (combined from dir1 and dir2)
-root/b.txt (combined from dir3 and dir4)
-root/c.txt

Si ce n'est pas possible, je me contenterai de déplacer tous les fichiers à la racine et de les renommer par lots. Donc quelque chose comme

-root/a.txt.1
-root/a.txt.2
-root/b.txt.1
-root/b.txt.2
-root/c.txt.1

J'espère que cela a du sens, et merci d'avance :)

0voto

keeney Points 434

Si vous voulez les combiner et que les noms des fichiers sont connus à l'avance, vous pouvez essayer quelque chose comme.. :

for i in a b c d
do
find <root direcoty> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

Pour chaque a, b, c et d, nous recherchons les fichiers portant le nom a.txt (b.txt ... d.txt) dans tous les répertoires, nous invoquons cat sur les noms de fichiers et nous dirigeons la sortie vers un fichier portant le même nom dans le répertoire racine.

S'ils ne sont pas connus à l'avance, cela devient un peu délicat, mais ici :

for i in `find <root directory> -type f | sed -E 's!\./.*/([a-zA-Z0-9]+)\.txt!\1!g'`
do
find <root directory> -iname "$i.txt" -exec cat {} \; > <root directory>/$i.txt
done

C'est la même chose que la commande précédente, sauf que nous obtenons notre liste à partir de là. Nous obtenons d'abord une liste de tous les fichiers dans le répertoire racine, puis nous supprimons toutes les parties des noms de fichiers pour n'inclure que le nom du fichier (pas de direction ni d'extension). Vous devez noter que cela ne fonctionnera que pour les fichiers dont le nom comporte des lettres minuscules et majuscules mélangées à des chiffres, sans tirets ni sous-titres. Si vous les voulez, changez [a-zA-Z0-9] a [a-zA-Z0-9-_] .

Changez toute instance de <root directory> vers le chemin souhaité.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X