Я ненавижу rm -rf /*
, поэтому я хочу что-то повторить вместо того, чтобы бежать rm -rf /*
. Как я могу сделать это возможным?
"Ненавистью" я предполагаю, что Вы подразумеваете, что боитесь случайного выполнения этого?
команда rm -r /
(с или без -f
) предложит Вам:
rm: it is dangerous to operate recursively on `/'
rm: use --no-preserve-root to override this failsafe
, К сожалению, это не проверяет это, когда Вы указываете /*
, потому что последний расширен в каждую папку. В то время как большинство папок и их содержание будут безопасны (потому что Вы не использовали sudo
), к сожалению, те, которые в Вашей домашней папке, будет удален.
нет никакого простого ответа на это. Вы могли записать функцию в .bashrc
, который проверяет на это, но это было бы довольно сложно: функция имела бы к:
-r
, -R
или --recursive
и использовали ли Вы --no-preserve-root
. /*
. я думаю, что -f
или --force
может быть проигнорирован, потому что без этого, команда все еще имеет способность нанести ущерб.
я записал сценарий, чтобы сделать точно это. Это ниже. Просто добавьте, что это в конец Вашего файла ~/.bashrc
, закрывает все открытые терминалы и вновь открыло терминал, и он должен работать.
Предупреждение, Предупреждение , ПРЕДУПРЕЖДЕНИЕ, ПРЕДУПРЕЖДЕНИЕ !
echo
перед фактическим rm
команда в сценарии (прямо в конце), чтобы позволить Вам тестировать. Это означает, что при выполнении его это отобразит команду вместо того, чтобы на самом деле выполнить его. При тестировании его полностью отредактируйте Ваш ~/.bashrc
для удаления Word echo
. sudo rm -rf /*
. Чтобы заставить его относиться к sudo†¦ хорошо, должен быть путь, но извините, я не знаю как. :(
я уверен, что кто-то умный здесь поймет это, в этом случае я могу добавить его к этому ответу. (Существует путь, если можно гарантировать, что sudo будет всегда использовать тот же ${PATH}
, но я не думаю, что это верно.) Вот сценарий:
#---------------------------------------------------------------------------------------------------
# Amendment to rm
#
# Check if it is likely that the user called rm on root with recursion but without the option
# --no-preserve-root
# If so, display a warning. Otherwise, allow rm to continue unhindered.
#---------------------------------------------------------------------------------------------------
function rm ()
{
# Extract all of the options and parameters.
local -r GETOPT="$( getopt --longoptions=force,interactive::,one-file-system,no-preserve-root,recursive,dir,verbose,help,version \
--options=fiIrRdv -- "${@}"
)"
# Replace the current parameters with the interpreted ones from rm.
eval set -- "${GETOPT}"
# Define variables to use in the function.
local -i FILES_COUNT=0 # The number of files and folders found.
local ALL_ROOT=true # Assume true unless found otherwise.
local RECURSIVE_USED=false # Unless found true.
local NO_PRESERVE_ROOT_USED=false # Unless found true.
local PARAM # To hold the parameter being inspected.
local INTERACTIVE_STATE=false # Whether we are expecting an option to --interactive.
# Run through the parameters to find if we should catch this command.
for PARAM
do
# Handle the option --interactive first.
if ${INTERACTIVE_STATE}
then
INTERACTIVE_STATE=false # Turn off the interactive state.
elif [[ ${PARAM} == '--interactive' ]]
then
INTERACTIVE_STATE=true
elif [[ ${PARAM} == '-r' || ${PARAM} == '-R' || ${PARAM} == '--recursive' ]]
then
RECURSIVE_USED=true
elif [[ ${PARAM} == '--no-preserve-root' ]]
then
NO_PRESERVE_ROOT_USED=true
elif [[ ${PARAM} =~ ^- ]]
then
: # Ignore any option that we don't care about.
else
: $(( ++FILES_COUNT )) # Keep count.
if ! [[ ${PARAM} =~ ^/ ]]
then
ALL_ROOT=false # This isn't a root file or folder.
fi
fi
done
# Is this likely to be the command that we are searching for?
if (( FILES_COUNT > 0 )) && ${RECURSIVE_USED} && ${ALL_ROOT} && ! ${NO_PRESERVE_ROOT_USED}
then
# Yes! Recursive; all root files and folders; and missing no-preserve-root.
# Leave a message and exit with an error.
echo 'You are using rm to remove all root files and folders.' >&2
echo 'Please use --no-preserve-root if that is really what you want.' >&2
return 3
fi
# No, this is (supposedly) safe. Run the command.
echo rm "${@}"
} # rm