web-dev-qa-db-fra.com

Script Bash pour renommer des fichiers dans un répertoire

J'essaie d'écrire un script qui prend un répertoire comme paramètre de ligne de commande et effectue une itération sur les fichiers du répertoire en modifiant leur extension en .bu.

Je pensais que cela fonctionnerait mais je reçois la sortie '.bu' is not a target directory

#!/bin/bash

for  f in $1; do
  mv "$f".* .bu
done
5
Michael James
#!/bin/bash
cd $1
for f in *; do 
mv  "$f" "${f%.*}.bu"
done
8
Maythux

Essayez plutôt cela (en supposant que $1 est un dossier):

for f in $1/*; do 
  mv "$f" "$f.bu"
done

Ou utilisez l'utilitaire de changement de nom:

rename -v 's/$/\.bu/' $1/*

Ces commandes ajoutent une extension. Si vous voulez changer l'extension existante utilisez ceci:

rename -v 's/\.[^\.]+$/\.bu/' $1/*
5
chaos

En prenant l'approche KISS, je recommanderais le script suivant

#! /bin/bash
cd $1;
rename 's/$/\.bu/' *

Cela modifiera le premier paramètre du répertoire de travail, puis ajoutera une extension .bu à tous les fichiers. Cela annule le besoin de boucle.

EDIT:
Si vous voulez changer l’extension (au lieu de l’ajouter), vous pouvez essayer

rename 's/\..*$/\.bu/' *

commande à la place, dans le script ci-dessus.

2
Registered User

$1 au sein d'un script bashest une référence au premier argument transmis à partir de la ligne de commande. Vous essayez donc de traiter un seul dossier.

Il existe déjà des réponses sur la façon de résoudre votre problème en utilisant bashpur, mais j'aimerais ajouter que si vous avez besoin d'un meilleur filtrage de ce qui est en cours de traitement, vous pouvez utiliser findavec quelques options pour sélectionner les fichiers à traiter:

find <path_to_directory> -maxdepth 1 -type f

* <path_to_directory> = chemin du répertoire

Puis parcourez la liste des fichiers en utilisant la redirection stdinname__:

#!/bin/bash

while read file
do
    rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)
1
kos