我想编写一个Shell脚本,以递归方式找到扩展名为.log的最大文件并将其列出。它必须进一步要求确认以将其删除。如果确认,则必须删除该文件。我是Shell脚本的新手,最接近的是:
#!/bin/bash
cd /
find . -name "*.log" -type f -exec du -sh {} + | sort -rh | head -n 10
这列出了前10个.log文件(最大的文件在前)。但是,我不知道如何从这里继续。如何解析此列表并要求确认删除每个文件并进行相应处理? 请帮助
答案 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