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

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

foo.coffee
foo.js
bar.js

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

foo.coffee
bar.js

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

3
задан 29 June 2013 в 20:35

2 ответа

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

2
ответ дан 29 June 2013 в 20:35

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

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]
  • Конструкция [[ ... ]] является условной конструкцией и использует условные выражения . Обратите внимание, что я использую прочную двойную квадратную скобку [[, а не одну [. Очень хорошая практика (в ).
  • Обратите внимание, что цитирование идеально. Это все на 100% безопасно в отношении файлов с пробелами или забавными символами в названии.

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

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

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

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

0
ответ дан 29 June 2013 в 20:35

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

Похожие вопросы: