Безопасный заменитель 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 *
;)