Linux 执行rm之前的文件提示列表
我开始使用“sudorm-r”来删除文件/目录。我甚至把它作为rm的别名 我通常知道我在做什么,而且我对linux用户很有经验 但是,我希望在执行rm之前,当我按下“回车”键时,屏幕上将显示文件列表,并在最后提示确定删除文件 选项-i-i-v不符合我的要求。我只需要一个屏幕上所有打印文件的提示Linux 执行rm之前的文件提示列表,linux,bash,shell,rm,Linux,Bash,Shell,Rm,我开始使用“sudorm-r”来删除文件/目录。我甚至把它作为rm的别名 我通常知道我在做什么,而且我对linux用户很有经验 但是,我希望在执行rm之前,当我按下“回车”键时,屏幕上将显示文件列表,并在最后提示确定删除文件 选项-i-i-v不符合我的要求。我只需要一个屏幕上所有打印文件的提示 谢谢。这个简单的脚本在删除指定的文件之前会提示输入y响应 rmc脚本文件: read -p "ok to delete? " ans case $ans in [yY]*) sudo rm "$@
谢谢。这个简单的脚本在删除指定的文件之前会提示输入y响应 rmc脚本文件:
read -p "ok to delete? " ans
case $ans in
[yY]*) sudo rm "$@" ;;
*) echo "Nothing deleted";;
esac
这样调用
./rmc *.tmp
这是一个shell函数,如果使用得当,它将实现您想要的功能。但是,如果您在当前shell中加载函数,然后尝试将其与sudo
一起使用,它将不会执行您期望的操作,因为sudo
会创建一个单独的shell。所以你需要把它做成一个shell脚本
#!/bin/bash
… same code as above …
# All this script does is create the function and then execute it.
# It's lazy, but functions are nice.
delcheck "$@"
…然后确保sudo
可以访问它。将它放在sudo
执行路径中的某个位置(取决于sudo
配置)。然后,如果您真的想将它精确地作为sudo rm-r*
执行,您仍然需要将脚本命名为rm
,这在我看来是危险的)并确保其路径位于路径中的/bin
之前。(也很危险)。但你来了 这里有一个不错的选择
别名rm
至echo|xargs-p rm
-p
选项表示“交互式”-它将显示整个命令(包括任何展开的文件列表),并要求您确认
它不会询问递归删除的文件。但它将扩展到rm*.o
:
rm -rf * .o
rm -rf program.cc program.cc~ program program.o backup?... # NO NO NO NO NO!
这比接收错误要好得多
rm: .o file not found
编辑:根据切普纳评论更正了解决方案。我以前的解决方案有一个bug:(我创建了一个脚本来执行此操作。该解决方案类似于@kojiro 使用文件名
del
保存脚本。运行命令sudo chmod a=r+w+x del
使脚本成为可执行脚本。在要保存脚本的目录中,通过在“~/.bashrc”文件中输入export path=$path:/to/the/del/executable
导出路径,然后运行source~/.bashrc
这里,保留了rm
的语法,除了键入rm…
之外,键入del…
,其中del
是下面bash脚本的名称
#! /bin/bash
# Safely delete files
args=("$@") # store all arguments passed to shell
N=$# # number of arguments passed to shell
#echo $@
#echo $#
#echo ${args[@]:0}
echo "Files to delete:"
echo
n=`expr $N - 1`
for i in `seq 0 $n`
do
str=${args[i]}
if [ ${str:0:1} != "-" ]; then
echo $str
fi
done
echo
read -r -p "Delete these files? [y/n] " response
case $response in
[yY][eE][sS]|[yY])
rm ${args[@]:0}
esac
$*
不是你想要的。如果其中一个参数是“-rf/”你会被问到一个可怕的问题。使用“$@”
包括引号。我尝试了你的脚本,但当我使用sudo rm-r*
删除当前目录中的所有文件时,仍然没有列出文件。@user112693脚本将执行删除操作。如果要删除当前目录中的所有文件,请尝试/rmc*
我个人的意见是“经验丰富的Linux用户"甚至不会考虑别名<代码> RM<代码> >代码> SUDO RM- R <代码>…这只是一个BOOM!!!等待一个关键的时间发生……TWalbg一个相当有经验的Linux用户有时间考虑很多坏主意。你怎么会有经验?”Kojiro没有说一个有经验的用户在过去不会考虑过。,而是当你考虑了相当多的坏主意,并拒绝了它们,变得相当有经验时,你就不会再回到某些坏主意并采纳它们了……(而且,毕竟,它明确表示这只是我的意见……)@ Kojiro @ TwitalBug,我们都有足够的时间考虑坏主意。我知道我已经实现了很多。但是对<代码>别名RM=“SUDO RM -R”当然是轻率的…当然也是我自己的观点。即使你使用它而不是<代码> RM向前移动,<代码>别名RMR!=“SUDO RM -R”。会好得多。如果你的工作流程通过提升rm
的每次使用效率而变得更加高效,那么我建议在为每一个小的演示工作退出C4之前,早就查看一下你的用户、组和权限管理。谢谢@kojiro,这就是我想要的实际上,您不需要echo。只需使用xargs-prm-rf$*
就可以了,因为别名不带参数,$*
将引用当前shell的参数,而不是rm
别名使用的文件。@chepner-ehm,您是对的。但我的第二个建议仍然有效,因为参数在别名的结尾
#! /bin/bash
# Safely delete files
args=("$@") # store all arguments passed to shell
N=$# # number of arguments passed to shell
#echo $@
#echo $#
#echo ${args[@]:0}
echo "Files to delete:"
echo
n=`expr $N - 1`
for i in `seq 0 $n`
do
str=${args[i]}
if [ ${str:0:1} != "-" ]; then
echo $str
fi
done
echo
read -r -p "Delete these files? [y/n] " response
case $response in
[yY][eE][sS]|[yY])
rm ${args[@]:0}
esac