Безопасный заменитель OS X `rm`?

Я привык иметь rm что-то более безопасное.

Я использую osx-trash, но как только я обновляю до Ruby 1.9.2, это перестает работать.

Я знаю о trash-cli из Python, но я бы предпочел что-то, что перемещает файлы в папку "Корзина" в OS X, а не в другой каталог.

У кого-нибудь есть хорошее решение?

3 ответа

Для OSX вы можете использовать safe-rm

brew install safe-rm

Вы должны сделать дополнительный шаг, чтобы предпочесть его по умолчанию rm добавить символическую ссылку.

echo $PATH

Для меня у меня есть /usr/local/bin: во-первых, тот же реж safe-rm устанавливать

Добавить символическую ссылку на safe-rm

ln -s /usr/local/bin/safe-rm /usr/local/bin/rm

Удалить и восстановить настройки по умолчанию rm Вы можете удалить символическую ссылку rm /usr/local/bin/rm

Конфигурационный файл может быть добавлен в /etc/safe-rm.conf

например:

/private
/Applications
/Developer
/Library
/Network
/System
/Users
/Volumes
/test

Тест с rm -rf /test это будет отрицать удаление из safe-rm.conf

http://hasseg.org/trash/ - это утилита Objective-C, такая как osx-trash.

Я написал функцию оболочки, которая не перезаписывает файлы, такие как mv * ~/.Trash было бы. Тем не менее, он всегда перемещает элементы в начальный том.

trash() {
    for f in "$@"; do
        bn=$(basename "$f")
        while [ -e ~/.Trash/"$bn" ]; do
            bn="$bn $(date +%H.%M.%S %p)"
        done
        mv "$f" ~/.Trash/"$bn"
    done
}

Введение (вы можете пропустить это)

Для меня rm -i было бы достаточно, потому что он предлагает вам перед удалением любого файла. Тем не менее, некоторая дополнительная безопасность обеспечивается safe-rm совсем не плохая идея.

Просто alias лайк rm=safe-rm -i может быть достаточно, однако rm -rf не будет работать, потому что -i переопределяется -f,

Итак, мы должны убедиться, что -i всегда приходи после -f!


Мое решение (3 шага):

  • Установите safe-rm: brew install safe-rm

    Вы все еще можете работать с rm, но вы должны изменить RM_BIN на следующем этапе

  • Отредактируйте свой ~/.profile (или bash_profile или что-то еще), и поместите следующий фрагмент кода (который содержит alias и function):

    alias rm="rm_i"
    
    function rm_i(){
    RM_BIN=safe-rm # you can replace it with regular rm if you like
    
    args=""
    files=""
    argsDone=0 # to make sure arguments are before the files
    
    for var in "$@"
    do
        if [[ $var == \-* ]] ; then
            if [ $argsDone -eq 1 ] ; then
                $RM_BIN # just to show the usage of rm
                return
            fi
            args+=" $var"
        else
            argsDone=1
            files+=" $var"
        fi
    done
    
    args+=" -i" # Put -i at the end (so rm -rf will not ignore it)
    
    $RM_BIN $args $files
    }
    
  • Наконец, logout а также loginТаким образом, обновления в.profile применяются. НЕ используйте его до выхода / входа!


Заметки:

  • Его можно применить к любому дистрибутиву Linux с небольшими изменениями.
  • Это НЕ перемещает ваш персонал в трэш. Он просто спрашивает вас перед удалением каждого файла!
  • Работает с -rf и с регулярными выражениями.
  • Если вы действительно хотите использовать rm -rf БЕЗ запроса на каждый файл / папку, которую вы все еще можете использовать /bin/rm -rf (или же safe-rm -rf если вы установили его).
  • Нет больше непреднамеренного rm -rf или же rm *;)
Другие вопросы по тегам