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
#!/bin/bash
cd $1
for f in *; do
mv "$f" "${f%.*}.bu"
done
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/*
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.
$1
au sein d'un script bash
est 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 bash
pur, mais j'aimerais ajouter que si vous avez besoin d'un meilleur filtrage de ce qui est en cours de traitement, vous pouvez utiliser find
avec 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 stdin
name__:
#!/bin/bash
while read file
do
rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)