【问题标题】:prompt list of files before execution of rmrm 执行前的提示文件列表
【发布时间】:2013-07-23 01:30:37
【问题描述】:

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

我通常知道自己在做什么,而且我是非常有经验的 linux 用户。

但是,我希望当我按“ENTER”时,在执行 rm 之前,屏幕上会显示一个文件列表,最后会提示确定删除文件。

Options -i -I -v 没有做我想做的事。对于屏幕上的所有打印文件,我只需要一个提示。

谢谢。

【问题讨论】:

  • 我个人的看法是,一个“非常有经验的 Linux 用户”甚至不会考虑将 rm 别名为 sudo rm -r...这只是一个 BOOOM !!!等待关键时刻发生...
  • @twalberg 一位经验丰富的 Linux 用户有时间考虑很多坏主意。你还有什么经验?
  • @Kojiro 并不是说​​一个非常有经验的用户在过去不会考虑到这一点,而是说当你考虑了相当多的坏想法并拒绝它们并变得很有经验时,你然后不会回到某些坏主意并无论如何都采用它们......(毕竟,它明确表示这只是我的意见......)
  • @Kojiro @twalberg 我们都有足够的时间考虑坏主意。我知道我什至已经实施了很多。但是alias rm="sudo rm -r" 是彻头彻尾的鲁莽……当然,在我自己看来也是如此。即使您要使用它而不是 rm 继续前进,alias rmr!="sudo rm -r" 也会好得多。面对惯例飞行应该总是让你停下来。如果通过提升 rm 的每次使用使您的工作流程更加高效,我建议您在为每个小演示作业退出 C4 之前,先查看您的用户、组和权限管理。

标签: linux bash shell rm


【解决方案1】:
##
# Double-check files to delete.
delcheck() {
  printf 'Here are the %d files you said you wanted to delete:\n' "$#"
  printf '"%s"\n' "$@"
  read -p 'Do you want to delete them? [y/N] ' doit
  case "$doit" in
    [yY]) rm "$@";;
    *) printf 'No files deleted\n';;
  esac
}

这是一个 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,(在我看来是危险的)并确保它的PATH before /bin 在你的PATH 中。 (也很危险)。但是你去。

【讨论】:

  • 谢谢@kojiro,这就是我想要的。
【解决方案2】:

这是一个不错的选择

别名 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

编辑:根据 chepner 评论更正了解决方案。我以前的解决方案有一个错误:(

【讨论】:

  • 其实你不需要echo。只需使用xargs -p rm -rf $* 就可以了
  • 由于别名不带参数,$* 将引用当前 shell 的参数,而不是与 rm 别名一起使用的文件。
  • @chepner - 嗯,你是对的。但是我的第二个建议仍然有效,因为参数位于别名的末尾
【解决方案3】:

这个简单的脚本会在删除指定的文件之前提示一个 y 响应。

rmc 脚本文件:

read -p "ok to delete? " ans
case $ans in
    [yY]*) sudo rm "$@" ;;
    *) echo "Nothing deleted";;
esac

这样调用

./rmc *.tmp

【讨论】:

  • $* 不是你想要的。如果其中一个参数是“-rf /”,你会被问到一个可怕的问题。使用 "$@" 包括引号。
  • 我试了你的脚本,但是当我使用sudo rm -r *删除当前目录下的所有文件时,仍然没有列出文件。
  • @user112693 该脚本将执行删除操作。如果要删除当前目录下的所有文件,试试./rmc *
【解决方案4】:

我创建了一个脚本来执行此操作。解决方案类似于@kojiro 的。

使用文件名del 保存脚本。运行命令sudo chmod a=r+w+x del 使脚本成为可执行文件。在要保存脚本的目录中,通过在“~/.bashrc”文件中输入export PATH=$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

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2015-12-22
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2014-05-14
    • 2012-09-17
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多