![删除“重复”文件 shell 脚本](https://linux22.com/image/136084/%E5%88%A0%E9%99%A4%E2%80%9C%E9%87%8D%E5%A4%8D%E2%80%9D%E6%96%87%E4%BB%B6%20shell%20%E8%84%9A%E6%9C%AC.png)
我有一个文件列表,名为:
file.txt file (1).txt file (2).txt file (7).txt
ETC。
其中较大的(数字)是最后更新的文件,但某些中间数字可能会丢失,并且目录中还有其他文件。
如何检查是否存在“重复”文件,如果存在,如何将内容复制到file (maxnumer).txt
,file.txt
并删除所有file (*).txt
文件。
我尝试将它们列出ls -t file*(*)*.txt
,然后进行for
循环,但它给了我一个错误(ls
):bash:syntax error near unexpected token '('
答案1
假设时间戳不可靠,我们希望找到文件名末尾括号中数字最大的文件。
这样做:
#!/bin/sh
prefix=$1
if [ -z "$prefix" ]; then
printf 'Usage: %s prefix [ suffix ]\n' "$0" >&2
exit 1
fi
suffix=$2
for filename in "$prefix ("*")$suffix"; do
[ ! -f "$filename" ] && continue
num=${filename##*\(} # "file (xx).txt" --> "xx).txt"
num=${num%\)*} # "xx).txt" --> "xx"
# if no max number yet, or if current number is higher, update max
if [ -z "$max" ] || [ "$num" -gt "$max" ]; then
max=$num
fi
done
# if we have a max number, use it to rename the file and then remove the other files
if [ -n "$max" ]; then
printf 'Would move %s to %s\n' "$prefix ($max)$suffix" "$prefix$suffix"
# mv "$prefix ($max)$suffix" "$prefix$suffix"
printf 'Would remove %s\n' "$prefix ("*")$suffix"
# rm "$prefix ("*")$suffix"
else
printf 'Found no files matching "%s (*)%s"\n' "$prefix" "$suffix"
fi
运行它:
$ tree
.
|-- file (1).txt
|-- file (2).txt
|-- file (7).txt
|-- file.list
|-- file.txt
`-- script.sh
0 directory, 6 files
$ sh script.sh file .txt
Would move file (7).txt to file.txt
Would remove file (1).txt
Would remove file (2).txt
Would remove file (7).txt
(去掉注释掉的mv
,rm
真正修改文件)
对于诸如(这些也将被匹配)的文件名来说,这将失败,因为它假设所有文件名都遵循其中是整数的file (2) (30).txt
模式。prefix (NN)suffix
NN