Как я могу заставить «rm» перемещать файлы в корзину?

Я использую терминал ежедневно, я часто буду использовать rm DirectoryName. Иногда я становлюсь немного нетерпеливым и rm *не задумываюсь, безопасно ли это. Как вы понимаете, эти махинации иногда возвращались и били меня по лицу. Кто-нибудь знает, как я создаю сопоставление, чтобы rm whateverперемещать все в корзину, которую затем удаляю вручную.

ты можешь сделатьmv /file/to/delete ~./Trash
Трудно поставить тренировочные колеса на такой точный инструмент, как rm, не нарушая другие сценарии. Что-то вроде alias rm=/bin/rm -iдолжно вернуть вас в безопасное место. Кроме того, какой каталог корзины вы хотите использовать rm? Это становится неуклюжим, поскольку в Mac OS X есть папка для мусора для каждого тома, а также корзина для мусора на уровне пользователя.
Если вы используете zsh, по умолчанию он предложит вам, когда вы делаете rm *илиrm /path/*
Прошу прощения за мой драматический комментарий, но сам вопрос пугает меня, поскольку вы можете нанести большой ущерб с помощью rm, если у вас нет резервных копий или возможности переустановить машину.
Я также хочу извиниться, мой комментарий добавил драматизма и использовал «эйблистские» слова, которые не так помогают, как могут навредить другим. Я отредактировал несколько комментариев так, что сигнал «предупреждение/опасность» остался, но персонификация инструмента удалена.

Ответы (7)

Плохая идея

Использование rmдля перемещения файлов в корзину — это удар дофамина. Это обычное и приятное, но может быть вредным для вас вырванное из контекста.

Вам действительно нужно контролировать себя при использовании rm. Особенно, если ваши резервные копии неактуальны или у вас нет времени на стирание/установку/восстановление.


Не используйте РМ

Представьте , вы привыкли переезжать на мусор и сделали это привычкой. Конечно, ваша система в безопасности, но когда вы входите в блокнот друга (или жены, или начальника) и должны что-то удалить? На самом деле вы будете использовать настоящее rmудаление этих файлов навсегда. Без большой подготовки и квалификаций это плохая привычка, и вы должны это знать.

Поэтому вместо этого установите rmtrashи сделайте привычкой использовать его:

# install rmtrash, (either from the macports or by the brew.)
$ alias trash="rmtrash"
$ alias   del="rmtrash"       # del / trash are shorter than rmtrash

Исправление вредных привычек

Здесь начинается личный совет - изменить свое поведение трудно. Еще одна вещь, которую вы можете сделать, чтобы заставить себя использовать rmtrashвместо rmнее псевдоним для пользовательского сообщения в вашем файле .profile.

alias rm="echo Use 'del', or the full path i.e. '/bin/rm'"

Итак, всякий раз, когда вы используете rm, вам будет предложено либо использовать, rmtrashлибо /bin/rm. Помните, это временно, через некоторое время вы должны удалить псевдоним.


Никогда не делайте что-то вроде этого:

$ pwd
/
$ cd /tnp; rm -rf *
sh: cd: /tnp: No such file or directory

Популярная викторина: в каком каталоге будет rmвыполняться команда? :)

&&это ваш спасательный круг. ;это дьявол. PS Ответ заключается в том, что в приведенном выше примере почти все в вашей системе исчезает.
Хотя rm не выполняет безопасное удаление, а перемещение в корзину / пусто (в моей настройке).
trash-cliВместо этого пользователи Debian/Ubuntu устанавливают , например. aptitude install trash-cli- см. github.com/andreafrancia/trash-cli
@ jm666 Также проверьте мусор ( сообщение в блоге и источник ). Он запрашивает Finder для удаления файлов. Кроме того, он также может использовать стандартные API-интерфейсы файловой системы Objective C (быстрее) и откат к Finder, если недостаточно прав.brew install trash
rmtrashдействительно старый, последний раз обновлялся в 2003 году, и это видно. У него намного меньше опций, чем у rm, и если вы говорите rmtrashо дополнительном томе, он перемещает эти файлы в папку корзины вашего пользователя на системном диске, что может занять много времени для больших файлов. Вариант trash, рекомендованный parth, лучше, решает проблему сохранения того же тома, но по-прежнему не хватает многих rmвариантов.
Лучшее решение, которое я нашел, было: «rm-trash», с ppa: nateshmbhat/rm-trash
Для тех, кто на macOS: rmtrashбольше нет на доморощенном, поэтому я рекомендую trashвместо этого установить: brew install trash.
Однако просмотр мусора кода изменился с использования Finder по умолчанию на простое перемещение в ~/.Trash.
cd /tnp; rm -rf *адская команда
Это учебник, отличный ответ SE.

Я могу придумать дюжину способов закодировать это, но категорически отказываюсь печатать какой-либо из них в ответе. Я настоятельно рекомендую вам обуздать свою привычку немного сходить с ума . У вас вообще не должно быть привычки использовать rmего, если вы не можете использовать его должным образом.

Фундаментальная проблема заключается в том, что даже если вы установите защитную сетку в своей собственной системе, это только поможет вам сохранить свои вредные привычки, и когда вы когда-нибудь окажетесь на другой машине, на которой нет такой же специальной защиты, вы сделать что-то эпически плохое.

Правильное решение — использовать rmтак, как оно предназначалось для использования, включая ручное добавление -iаргумента всякий раз, когда вы сомневаетесь в том, как будет расширяться глобус, и иметь хорошие резервные копии системы, которые вы можете восстановить в случае серьезной ошибки пользователя. Попытка добавить «мусор» к командам, которые в остальной части вселенной его не используют, — это шаг на полпути, который является худшим из обоих миров.

Либо используйте мусор, либо нет. Использованиеrmне идет в мусор, оно удаляет.

Если вы хотите использовать мусор, в этом нет ничего плохого. Просто заведите привычку использовать rmtrashкоманду вместо rm. Это поможет вашему мозгу понять, что происходит, и не вовлечь вас в дурную привычку, которая впоследствии вызовет горе.

Ваша точка не вычисляется в этом случае. Люди ежедневно удаляют что-то случайно, резервные копии системы не работают в случае домашнего компьютера (как у меня), поскольку ресурсы ограничены, перемещение в корзину — гораздо более эффективный способ обработки этих удалений для моего конкретного случая. случай использования.
@steve, ты полностью упустил суть. rmпо определению удаляет файл с диска. В мусорку не отправляет. Если вы научитесь использовать rm, когда вы имеете в виду отправить в мусорное ведро , это приведет вас к катастрофе. Если вы хотите отправить в корзину, использовать rmtrashили программу, которая была предназначена для работы, то вы не будете страдать потом от кошмаров. Я не говорил, что использование мусора по своей сути неправильно, но если вы хотите его использовать, не подключайте его к чему-то, что не предназначено для его использования!
brew install rmtrashи перестань использоватьrm
Это потрясающий ответ, прояснивший для меня несколько вещей. Я постараюсь выработать привычку использовать rmtrashвместо rm.
"rm по определению удаляет файл с диска." Нет. rm отменяет связь с файлом. Это не удаляет его.

Используйте инструмент командной строки, такой как rmtrash (который обычно просто перемещает файлы в ~/.Trash, убедившись, что файл имеет уникальное имя) или скрипт, который использует appscript для вызова Finder для удаления. Последний медленнее, но добавляет возможность использовать опцию «Возврат» из Finder, чтобы легко восстановить файл.

Я использовал мусор , как в MacPorts и Homebrew, а rmtrash теперь очень старый и не поддерживается. Однако, читая изменения кода при редактировании этой заметки, я заметил, что в 2017 году он изменился с использования Finder по умолчанию на перемещение по умолчанию (это не то, что я хотел, и это серьезное изменение). Так что буду искать другое средство.

Как отмечалось в комментариях, не рекомендуется делать rm псевдонимом, лучше не забывать использовать программу-мусор, которую вы установили напрямую.

Но если бы вы хотели, вы могли бы сделать

После установки rmtrash, чтобы сказать /usr/local/bin/rmtrash, вы можете создать псевдоним для bash

alias rm='rmtrash'

Вы можете использовать \rmдля прямого вызова rm и игнорировать псевдоним

Если вы используете такой инструмент rmtrash, пожалуйста, сделайте себе одолжение и используйте его под собственным именем . Никогда не называй то, что не rmнужно rm, когда-нибудь это тебя укусит.
rmtrashне совместим с rm(не поддерживает те же параметры командной строки, что и -r), поэтому псевдоним действительно бесполезен в любом случае
Псевдоним rmtrashдля rm. Мало того, что они несовместимы, но также это приведет к плохой привычке, и вы случайно будете использовать rmв другой системе, думая, что используете только файлы rmtrash.

Просто хочу добавить полезную привычку для тех, кто этого еще не делает. Прежде чем использовать rm для чего-либо, сначала выполните для него команду ls. Таким образом, вы сможете увидеть все файлы, которые собираетесь удалить. Затем вместо повторного ввода просто вытащите предыдущую команду «ls» и замените ls на rm. Эта привычка уменьшила беспокойство при вызове rm.

Есть способы защитить себя от ужасных последствий от rm. Тем не менее, я согласен с другими комментаторами здесь: очень немногие из них хороши.

Ни на минуту не верьте, что изменение командной среды вам поможет. Например, вы повсюду найдете людей в Интернете, которые рекомендуют делать такие вещи:

alias rm="rm -i"

или же

function rm()
{
    echo >&2 'rm forbidden; use "/bin/rm"'
}
export -f rm

Это не будет работать. Период. Существует множество вариантов использования, когда эти маленькие салонные трюки с треском провалят вас.

Единственный надежный способ, который я использовал, чтобы избавить себя от опасности, rm— это настроить регулярный процесс резервного копирования через cron для каталогов, в которых я работаю. Raw UNIX сделает это за вас очень просто, используя findвместе с -mtimeдля проверки файлов, которые были обновлены в течение или после определенного времени.

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

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

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

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


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

  • Установите сейф-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 * ;)
Псевдоним rm для чего-то большего, чем он сам (например alias rm='sudo rm', ) похож на привязку УЗИ к кухонному ножу: когда-нибудь вы получите больше, чем рассчитывали, когда пойдете резать этот ананас. Псевдоним rm для чего-то меньшего, чем он сам (например alias rm='rmtrash', ) — это то же самое, что позволить вашим детям играть с разоруженными ручными гранатами и не учить их тому, чем они являются на самом деле: когда-нибудь, когда они столкнутся с настоящей гранатой, они не будут относиться к ней с должной осторожностью. В любом случае, псевдоним rm вреден для системных администраторов, так же как отсутствие гигиены — для личной безопасности и общественного здоровья!
Разумным советом будет использование чего-то вроде safe-rm. Псевдоним для rm не является. Используйте его под собственным именем или уникальным псевдонимом, чтобы не считать само собой разумеющимся систему безопасности, которая не всегда будет там.
Я вижу вашу точку зрения. НО, причина, по которой я это сделал, заключается в том, что я работаю со многими терминалами... некоторые удаленные терминалы и некоторые локальные терминалы. И я хочу бросить много гранат на удаленные терминалы, но когда я случайно дерну защитную пломбу на локальном терминале, я хочу увидеть предупреждение до того, как произойдет взрыв .
@Paschalis, а что произойдет, если необходимо использовать скрипт или установленную программу rm? Кроме того, точка зрения Калеба еще более верна: если вы привыкнете к системе с псевдонимом safe-rm, то вы можете вести себя с ней безрассудно и в конечном итоге использовать ее в системе с псевдонимом rm без псевдонима.
Также имейте в виду, что существует несколько различных воплощений safe-rm. Плагин ZSH для перемещения файлов в корзину, Perl-скрипт для занесения в черный список важных папок и т. д., а также Rust-версия того же самого.

Mac bigSur

brew install trash

alias rm='trash'
which rm

touch a.md
rm a.md
ls ~/.Trash
Почему это работает только на Big Sur?