Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 执行rm之前的文件提示列表_Linux_Bash_Shell_Rm - Fatal编程技术网

Linux 执行rm之前的文件提示列表

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 "$@

我开始使用“sudorm-r”来删除文件/目录。我甚至把它作为rm的别名

我通常知道我在做什么,而且我对linux用户很有经验

但是,我希望在执行rm之前,当我按下“回车”键时,屏幕上将显示文件列表,并在最后提示确定删除文件

选项-i-i-v不符合我的要求。我只需要一个屏幕上所有打印文件的提示


谢谢。

这个简单的脚本在删除指定的文件之前会提示输入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