rm se houver um arquivo com o mesmo nome de base

3

Digamos que eu tenha os seguintes arquivos:

foo.coffee
foo.js
bar.js

Existe uma maneira fácil de como rm *.js se houver um arquivo .coffee correspondente? No exemplo, esse comando removeria foo.js deixando:

foo.coffee
bar.js

Estou procurando algum tipo de rm wrap, pois preciso fazer um rm -r recursivo.

    
por mreq 29.06.2013 / 18:35

2 respostas

5

Um pouco de bash (usando todas as práticas recomendadas!) :

shopt -s nullglob

for f in *.js; do
    coffee=${f%.js}.coffee
    [[ -f $coffee ]] && rm -v -- "$f"
done
  • nullglob é um comportamento opcional do shell para que *.js seja expanda para a string vazia se não houver arquivos com extensão js .
  • Use expansão de parâmetros do shell para remover a extensão .js e substitua-o por .coffee na variável coffee .
  • rm é usado com a opção -v (verbose) para que você veja o que está acontecendo.
  • rm também é usado com -- que marca o final das opções, caso haja um arquivo que comece com um hífen: nesse caso, rm seria confuso e tentaria interpretar uma opção.
  • A construção [[ ... ]] é uma construção condicional e usa expressões condicionais . Observe que estou usando o colchete duplo robusto [[ e não o único [ . Prática muito boa (em bash ).
  • Note que a citação é perfeita. É 100% seguro em relação a arquivos com espaços ou símbolos engraçados em seu nome.

Para fins de teste, você deve colocar echo na frente de rm :

    [[ -f $coffee ]] && echo rm -v -- "$f"

para que apenas ecoa o comando e não remova nada. Quando você estiver feliz com isso, remova o echo .

Aproveite!

    
por gniourf_gniourf 29.06.2013 / 19:05
2

Crie este script (eu chamei de 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

Em seguida, execute remove.sh <directory> js coffee .

    
por Eric Carvalho 29.06.2013 / 19:23