web-dev-qa-db-fra.com

Fusionner plusieurs répertoires contenant des fichiers portant le même nom

J'ai fouillé dans les questions, mais je n'arrive pas à trouver la réponse exacte dont j'ai besoin.

J'ai un répertoire avec plusieurs sous-répertoires:

sent       sent.~16~  sent.~22~  sent.~29~  sent.~35~  sent.~41~  sent.~48~  sent.~54~  sent.~60~  sent.~67~  sent.~73~  sent.~8~
sent.~10~  sent.~17~  sent.~23~  sent.~3~   sent.~36~  sent.~42~  sent.~49~  sent.~55~  sent.~61~  sent.~68~  sent.~74~  sent.~80~
sent.~11~  sent.~18~  sent.~24~  sent.~30~  sent.~37~  sent.~43~  sent.~5~   sent.~56~  sent.~62~  sent.~69~  sent.~75~  sent.~81~
sent.~12~  sent.~19~  sent.~25~  sent.~31~  sent.~38~  sent.~44~  

Où chaque sous-répertoire contient un tas de fichiers numérotés:

1.   11.  13.  15.  17.  4.  6.  8.
10.  12.  14.  16.  3.   5.  7.  9.

Essentiellement, j'aimerais fusionner tous ces sous-répertoires dans un seul répertoire, sans toutefois écraser les fichiers portant le même nom. Devrai-je modifier le nom des fichiers de chaque sous-répertoire (par exemple, foo --> foo_~10~)), puis fusionner tous les fichiers dans un seul sous-répertoire?

Existe-t-il un script bash ou shell facile à utiliser pour cela? J'ai essayé quelques variantes de rsync, mv et cp, mais je n'ai pas bien compris ce que je voudrais.

3
Gerrrald1

Vous pouvez le faire avec un script comme

#!/bin/bash

mkdir merged
for dir in sent*
do
    cd "$dir"
    for file in *
    do
        mv "$file" "$file"_"${dir#sent.}"
    done
    mv * ../merged
    cd ..
done

si vous souhaitez renommer chaque fichier conformément au schéma de votre question. Si vous souhaitez les renommer de manière à ce que leur ordre lexicographique reflète dans quel dossier le fichier était à l'origine, il suffit de changer l'ordre des chaînes $file et ${dir#sent.}.

2
Stefan Hamcke