Скажите, что у меня есть следующие файлы:
foo.coffee
foo.js
bar.js
Есть ли простой способ как rm *.js
, если есть соответствующий файл .coffee
? В примере такая команда удаляет foo.js
, оставляя:
foo.coffee
bar.js
Я ищу какой-то обтекатель rm
, поскольку мне нужно сделать рекурсив rm -r
.
Создайте этот сценарий (я назвал его 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
.
Немного о 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
будет сбит с толку и попытается интерпретировать опцию. [ 1128] [[ ... ]]
является условной конструкцией и использует условные выражения . Обратите внимание, что я использую прочную двойную квадратную скобку [[
, а не одну [
. Очень хорошая практика (в bash ). В целях тестирования вы должны поставить echo
перед rm
:
[[ -f $coffee ]] && echo rm -v -- "$f"
, чтобы он только повторял команду и ничего не удалял. Когда вы довольны этим, удалите echo
.
Наслаждайтесь!