我想比较文件夹中的两个文件并删除名称中较小的数字。
例如,假设名字是yearMonthDay.txt
。我想和sudo rm
它比较一下哪个数字更小。
我知道我可以通过以下方式获取号码:
find *txt | awk -F'[_.]' '{ print $1}'
那么接下来我应该如何比较呢?使用系统变量?其实我以前没有使用过shell变量。
答案1
我建议你做如下的事情:
我创建了一个目录,其中包含一些具有“正常”类似日期名称的文件,一个文件名称中带有空格(使您需要引用)和一个名称中带有换行符的文件(如果命令您使用假设换行符分隔文件)。
$ find
.
./20210710.txt
./20200131.txt
./20210611.txt
./2020?0131.txt
./20201131.txt
./2020 131.txt
以下命令行用于stat
帮助find
txt 文件的列表,
$ find -name '*.txt' -exec stat -c '%N' {} \;
'./20210710.txt'
'./20200131.txt'
'./20210611.txt'
'./2020'$'\n''0131.txt'
'./20201131.txt'
'./2020 131.txt'
现在对其进行排序(无需删除扩展即可完成)
$ find -name '*.txt' -exec stat -c '%N' {} \; | sort
'./20200131.txt'
'./20201131.txt'
'./2020 131.txt'
'./2020'$'\n''0131.txt'
'./20210611.txt'
'./20210710.txt'
并选择最旧的一个(位于列表顶部)
$ find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1
'./20200131.txt'
现在您可以通过以下方式删除该文件
rm $(find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1)
如果存在空格或其他特殊字符的风险,您想引用它(但请仔细检查以避免与之前的引用发生冲突)
rm "$(find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1)"
您还可以设置一个变量,并在稍后的 shell 脚本中的命令中使用它
#!/bin/bash
find -name '*.txt' -exec stat -c '%N' {} \; | sort
var1=$(find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1)
echo '---'
read -p "Remove $var1? (y/N) " ans
if [ "$ans" == "y" ]
then
eval rm "$var1"
fi