web-dev-qa-db-fra.com

rm s'il y a un fichier avec le même nom de base

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.

3
mreq

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.
  • Utilisez Expansion des paramètres du shell pour supprimer l'extension .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.
  • Le [[ ... ]] 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 ).
  • Notez que la citation est parfaite. Tout est sûr à 100% en ce qui concerne les fichiers qui ont des espaces ou des symboles amusants dans leur nom.

À 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!

5
gniourf_gniourf

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.

2
Eric Carvalho