Ненавижу 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, закройте все открытые терминалы и снова откройте терминал, и он должен работать.
Предупреждение, предупреждение, ПРЕДУПРЕЖДЕНИЕ, закрыть все открытые терминалы [ ! d9]!
Пожалуйста, тщательно проконсультируйтесь, прежде чем использовать его вживую. Я положил echo перед фактической командой rm в скрипте (справа в конце), чтобы вы могли протестировать. Это означает, что когда вы запустите его, он отобразит команду вместо фактического ее запуска. Когда вы тщательно протестировали его, отредактируйте свой ~/.bashrc, чтобы удалить слово echo. Это относится к вашему терминалу. Это не относится к root, т. Е. Sudo. Таким образом, это все равно приведет к хаосу, если вы запустите 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
Под «ненавистью» я предполагаю, что вы имеете в виду, что вы боитесь случайно запустить это?
Команда 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, закройте все открытые терминалы и снова откройте терминал, и он должен работать.
Предупреждение, предупреждение, ПРЕДУПРЕЖДЕНИЕ, закрыть все открытые терминалы [ ! d9]!
Пожалуйста, тщательно проконсультируйтесь, прежде чем использовать его вживую. Я положил echo перед фактической командой rm в скрипте (справа в конце), чтобы вы могли протестировать. Это означает, что когда вы запустите его, он отобразит команду вместо фактического ее запуска. Когда вы тщательно протестировали его, отредактируйте свой ~/.bashrc, чтобы удалить слово echo. Это относится к вашему терминалу. Это не относится к root, т. Е. Sudo. Таким образом, это все равно приведет к хаосу, если вы запустите 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