在执行rm之前提示文件列表

时间:2013-07-23 19:28:54

标签: linux bash shell rm

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

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

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

选项-i -I -v没有做我想要的。我只想在屏幕上显示所有打印文件的一个提示。

谢谢。

4 个答案:

答案 0 :(得分:4)

##
# 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在你的PATH中 /bin之前是。 (也很危险)。但是你去吧。

答案 1 :(得分:2)

这是一个不错的选择

别名rmecho | 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评论更正了解决方案。我之前的解决方案有一个错误:(

答案 2 :(得分:1)

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

rmc脚本文件:

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

这样调用

./rmc *.tmp

答案 3 :(得分:0)

我创建了一个脚本来执行此操作。解决方案与@ 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