Гм если есть файл с таким же базовым именем

Скажем, у меня есть следующие файлы:

foo.coffee
foo.js
bar.js

Есть ли простой способ, как rm *.js если есть соответствующий .coffee файл? В примере такая команда удалит foo.js выезд:

foo.coffee
bar.js

Я ищу какой-то rm заверните, как мне нужно сделать рекурсивный rm -r,

2 ответа

Решение

Немного bash (используя все лучшие практики!):

shopt -s nullglob

for f in *.js; do
    coffee=${f%.js}.coffee
    [[ -f $coffee ]] && rm -v -- "$f"
done
  • nullglob это необязательное поведение оболочки, так что *.js развернется до пустой строки, если нет файлов с расширением js,
  • Используйте расширение параметра оболочки, чтобы удалить расширение .js и заменить его на .coffee в переменной coffee,
  • rm используется с -v включите (многословно), чтобы вы видели, что происходит.
  • rm также используется с -- который отмечает конец опций, на случай, если есть файл, начинающийся с дефиса: в этом случае, rm будет смущен и попытаться интерпретировать вариант.
  • [[ ... ]] Конструкция является условной конструкцией и использует условные выражения. Обратите внимание, что я использую прочную двойную квадратную скобку [[ и не единственный [, Очень хорошая практика (в bash).
  • Обратите внимание, что цитирование идеально. Это все на 100% безопасно в отношении файлов с пробелами или забавными символами в названии.

Для целей тестирования вы должны поставить echo перед rm:

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

так что он только повторяет команду и ничего не удаляет. Когда вы довольны этим, удалите echo,

Наслаждайтесь!

Создайте этот скрипт (я назвал это 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

Тогда беги remove.sh <directory> js coffee,

Другие вопросы по тегам