bash命令/脚本删除旧文件版本

时间:2014-03-03 15:09:00

标签: linux bash

我有一个包含大量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

命令或脚本无动于衷,任何人都可以帮助我吗?

3 个答案:

答案 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