我有一个包含大量pdf文件的目录。 此文件由另一个脚本生成,该脚本使用新版本的渐进编号重命名文件:(示例)
newyork_v1.pdf
newyork_v2.pdf
newyork_v3.pdf
miami_v1.pdf
miami_v2.pdf
rome_v1.pdf
版本号是相对于文件的,有些文件是版本1,有人在版本2等,例如。 有些文件保留在版本1中,有些文件可能会增长到第10版。
在临时目录中复制此目录后,我想删除所有文件的旧版本,在示例中必须保留:
newyork_v3.pdf
miami_v2.pdf
rome_v1.pdf
我尝试按ls和sort命令排序和删除,但我没有得到所需的结果,我尝试:
ls | sort -k2 -t_ -n -r | tail -n +2 | xargs rm
使用此命令仅保留rome_v1.pdf
命令或脚本无动于衷,任何人都可以帮助我吗?
答案 0 :(得分:4)
for file in $(ls *.pdf | awk -F'_' '{print $1}' | sort -u)
do
count=$(ls ${file}* | wc -l)
if [ ${count} -gt 1 ]; then
ls -rv ${file}* | tail -$(($count-1)) | xargs rm
fi
done
答案 1 :(得分:2)
如果您可以使用GNU ls,可以尝试以下方法:
for p in $(ls -v *.pdf | cut -d_ -f1 | sort | uniq); do
ls -v $p* | head -n -1 | xargs -I{} rm {} 2>/dev/null
done
GNU的-v标志ls文件'自然'即。在你的情况下:
miami_v1.pdf
miami_v2.pdf
newyork_v1.pdf
newyork_v2.pdf
newyork_v3.pdf
newyork_v10.pdf #Added to show ls -v in action
rome_v1.pdf
然后我们遍历每个uniq前缀并删除除最后一个匹配前缀的文件以外的所有内容。
结果:
miami_v2.pdf
newyork_v10.pdf
rome_v1.pdf
更新
更改了xargs以处理空格和特殊字符。
答案 2 :(得分:0)
此Perl脚本可用于过滤掉旧文件名:
#!/usr/bin/perl
use warnings;
use strict;
my %files;
my @old_files;
while (<DATA>) {
chomp;
my ($name, $version, undef) = split /_v|\./, $_;
if (!$files{$name}->{version}) {
$files{$name}->{version} = $version;
$files{$name}->{name} = $_;
next;
}
if ($files{$name}->{version} < $version) {
push @old_files, $files{$name}->{name};
$files{$name}->{version} = $version;
$files{$name}->{name} = $_;
}
}
foreach my $file (@old_files) {
print "$file\n";
}
__DATA__
newyork_v1.pdf
newyork_v2.pdf
newyork_v3.pdf
miami_v1.pdf
miami_v2.pdf
rome_v1.pdf