1 votes

Ajouter à un nom de fichier préfixé le nom de son répertoire

J'ai environ 100 répertoires tels que :

  • la marche,
  • l'écriture,
  • la danse,
  • la natation.

Chacun de ces répertoires contient un ensemble de fichiers.

Je voudrais ajouter le nom préfixe du répertoire aux noms de ses fichiers.

Par exemple :

writing :
0ZPQl5QUvo0_000202_000212.mp4  
AFV8x8ezN8g_000016_000026.mp4  
-HutuMqTAPw_000275_000285.mp4 
qtvsw6h3yQo_000228_000238.mp4  
Ub0rc6U6nfI_000100_000110.mp4

devient :

writing :
writing_0ZPQl5QUvo0_000202_000212.mp4  
writing_AFV8x8ezN8g_000016_000026.mp4  
writing_-HutuMqTAPw_000275_000285.mp4 
writing_qtvsw6h3yQo_000228_000238.mp4  
writing_Ub0rc6U6nfI_000100_000110.mp4

Comment puis-je faire ça ?

4voto

steeldriver Points 118154

Voici une version légèrement améliorée de votre script - les principales différences sont les suivantes

  • en utilisant un glob Shell * à la place de $(ls) - voir Bash Pitfall #1

  • en citant toute expansion de variable (permet les noms de fichiers avec des espaces ou d'autres caractères bizarres - cf. Bash Pitfall #2 )

  • marquant la fin des options pour mv en utilisant le -- Extension GNU - cela lui permet de gérer les noms de fichiers qui commencent par des traits d'union.

Alors

for d in *; do 
  [[ -d "$d" ]] && cd "$d" || continue
  for f in *.mp4; do 
    echo mv -v -- "${f}" "${d}_${f}"
  done
  cd -
done

Ou, plus facilement, vous pouvez boucler sur ./*.mp4 pour protéger les traits d'union en tête, mais il faut ensuite les supprimer lors de l'opération d'encodage. mv

for d in *; do 
  [ -d "$d" ] && cd "$d" || continue
  for f in ./*.mp4; do 
    echo mv -v "${f}" "${d}_${f#./}"
  done
  cd -
done

Dans les deux cas, retirez le echo (et le -v si vous le souhaitez) une fois que vous êtes sûr qu'il fonctionne comme vous le souhaitez.

1voto

Joseph Points 125

Le problème est résolu en utilisant le script suivant :

for i in $(ls); do                                                 
  if [ -d $i ]; then                      
     fname=${i##*/}                 
     echo $fname                           
     cd $i                                       
     for z in *.mp4; do               
       echo $z  
       cp $z ${fname}_${z}
       rm $z                   
     done                                        
     cd ..                                         
  fi                                              
done

0voto

Restuta Points 4476

En supposant que vous êtes dans le répertoire contenant tous ces répertoires dancing , writing etc., la commande

for folder in $(find -mindepth 1 -type d); do
  cd $folder
  PRE=${folder#./}
  for file in *; do
    mv "$file" "${PRE}_$file"
  done
  cd ..
done

vous obtiendrez ce que vous voulez. Je l'ai testé, et cela a fonctionné même lorsque les noms de fichiers contenaient des espaces ou des retours à la ligne. En revanche, cela ne fonctionne pas avec de tels caractères dans les noms de dossiers, par exemple walking slowly .

Edit : Le code précédent ne gère pas les espaces ou les nouvelles lignes dans les noms de dossiers. Pour y remédier, utilisez le code modifié

for folder in *; do
  if [ -d "$folder" ]; then
    cd "$folder"
    PRE=${folder#./}
    for file in *; do
      mv "$file" "${PRE}_$file"
    done
    cd ..
  fi
done

Edit 2 : Si un nom de fichier commence par un - (tiret), la commande peut l'interpréter comme une option. Pour traiter les tirets de tête, insérez un -- entre les mv et ses arguments. Cela indique mv pour arrêter la recherche d'options.

Le code final est donc

for folder in *; do
  if [ -d "$folder" ]; then
    cd "$folder"
    for file in *; do
      mv -- "$file" "${folder}_$file"
    done
    cd ..
  fi
done

0voto

David Foerster Points 34353

Utilisez find et prename :

find DIR... -mindepth 1 -type f | prename -n 's/([^\/]+)\/([^\/]+)$/$1\/$1_$2/'

Retirer le -n pour renommer réellement les fichiers et ne pas simplement imprimer comment les fichiers seraient renommés.

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