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


9

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

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

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

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


9
Пожалуйста, не привыкайте к псевдониму rm, скорее привыкните mv files/to/be/deleted ~/.Trash. Это безопасно и согласованно для всех систем.
Асмус

Asmus: Вы видите, что это работает, только если ваш Mac имеет только 1 раздел. Если у вас есть другой раздел, перемещение в ~ / .Trash не совсем корректно (мой раздел ~ недостаточно большой).
disappearedng

1
Ну, вы должны были упомянуть в своем вопросе, что у вас есть несколько разделов!
Slhck

1
исчезают: хорошо, я думаю, что mvвсе еще ваша самая безопасная ставка. Вы можете легко создать новую папку в другом разделе под названием Trash(или как вам нравится), а затем mvфайлы там. Если вы уверены, что их можно удалить, удалите и заново создайте эту полную папку.
Асмус

и тогда вы можете просто сделать ~ / .Trash мягкой ссылкой на папку «Корзина» в разделе, на котором достаточно места
AlcubierreDrive

Ответы:


8

Для 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


было бы неплохо добавить также /в список путей, которые не должны быть удалены, чтобы предотвратить классический rm -fr /
Mikael Lepistö

3

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
}

Да, у меня более одного раздела, и я бы хотел сохранить удаленные файлы в одном и том же разделе, а не перемещать их
исчезал

Я добавил ссылки на две другие утилиты и другую функцию. Каждый из них должен хранить файлы в одном разделе.
Lri

2

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

Для меня 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 * ;)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.