Гм если есть файл с таким же базовым именем
Скажем, у меня есть следующие файлы:
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
,