Disons que j'ai les fichiers suivants:
foo.coffee
foo.js
bar.js
Existe-t-il un moyen simple de rm *.js
S'il existe un fichier .coffee
Correspondant? Dans l'exemple, une telle commande supprimerait foo.js
En laissant:
foo.coffee
bar.js
Je cherche une sorte d'habillage rm
car j'ai besoin de faire un récursif rm -r
.
Un peu de bash (en utilisant toutes les meilleures pratiques!):
shopt -s nullglob
for f in *.js; do
coffee=${f%.js}.coffee
[[ -f $coffee ]] && rm -v -- "$f"
done
nullglob
est un comportement optionnel du shell pour que *.js
se développera dans la chaîne vide s'il n'y a pas de fichiers avec l'extension js
..js
et remplacez-le par .coffee
dans la variable coffee
.rm
est utilisé avec le -v
switch (verbeux) pour voir ce qui se passe.rm
est également utilisé avec --
qui marque la fin des options, juste au cas où il y aurait un fichier commençant par un trait d'union: dans ce cas, rm
serait confus et tenterait d'interpréter une option.[[ ... ]]
construct est une construction conditionnelle et utilise expressions conditionnelles . Remarquez que j'utilise le support double carré robuste [[
et non le célibataire [
. Très bonne pratique (in bash ).À des fins de test, vous devez mettre echo
devant rm
:
[[ -f $coffee ]] && echo rm -v -- "$f"
de sorte qu'il ne fait qu'écho à la commande et ne supprime rien. Lorsque cela vous convient, supprimez le echo
.
Prendre plaisir!
Créez ce script (je l'ai appelé remove.sh):
#!/bin/bash
if [ -z "$3" ]; then
echo "Usage: $0 <directory> <extension-to-remove> <conditional-extension>"
exit 1
fi
if [ ! -d "$1" ]; then
echo "Invalid directory."
exit 1
fi
for FILE in $(find $1 -name "*.$3"); do
rm -v ${FILE%.$3}.$2
done
Exécutez ensuite remove.sh <directory> js coffee
.