Shell脚本以递归方式查找和列出最大的文件,要求确认以将其删除,如果确认,则将其删除

时间:2018-11-16 13:42:09

标签: shell

我想编写一个Shell脚本,以递归方式找到扩展名为.log的最大文件并将其列出。它必须进一步要求确认以将其删除。如果确认,则必须删除该文件。我是Shell脚本的新手,最接近的是:

#!/bin/bash cd / find . -name "*.log" -type f -exec du -sh {} + | sort -rh | head -n 10

这列出了前10个.log文件(最大的文件在前)。但是,我不知道如何从这里继续。如何解析此列表并要求确认删除每个文件并进行相应处理? 请帮助

2 个答案:

答案 0 :(得分:0)

尝试

rm -i $(find . -name "*.log" -type f -exec du -sh {} + | sort -rh | head -n 10)

基本上,将您的find命令的输出与“ rm -i”一起使用“ rm -i”强制rm命令是交互式的。如果您要删除文件,它将提示您。

希望这会有所帮助。

答案 1 :(得分:0)

如果您使用printf中的find函数,则可以轻松列出所有文件并根据文件大小对其进行排序:

find . -iname '*log' -printf "%s %p\0" | sort -z -k1rn

我们在这里使用\0作为行终止符,以避免可能的“有趣”文件名出现任何问题。现在可以将此输出通过管道传递到执行查询的简单while循环中:

find . -iname '*log' -printf "%s %p\0" | sort -z -k1rn \
    | while read -r -d  $'\0' size file; do
         echo "size: $size"
         echo "file: $file"
         while true; do
            read -p "Do you wish to delete this file (y/n) or quit (q)?" ynq
            case "$ynq" in
                [Yy]* ) rm "$file" ;;
                [Nn]* ) continue   ;;
                [Qq]* ) exit       ;;
                * ) echo "Please answer yes/no or quit.";;
            esac
         done
      done