删除编号范围的文件

时间:2014-05-14 00:40:35

标签: bash

我有一系列格式为 n .txt的文件,我希望除去3个 n之外的所有文件 紧接在所选文件之前。

即。如果我输入文件 24 .txt我想删除低于文件 20 .txt

以下作品,但有更简单的方法吗?也许使用find -name -delete或类似的?

file=file24.txt

num=$(sed 's/[^0-9]//g' <<< $file)
((num-=3))
while :
do
  files=($(find $dir -name "*txt"))
  count=${#files[@]}
  if ((count < 1 ))
  then 
   break
  fi
  rm file"$num".txt
  ((num--))
done

3 个答案:

答案 0 :(得分:1)

这是一种方法:

#!/bin/bash

# Grab the number from file passed to the script. $1 holds the that value
num="${1//[!0-9]}"

# To prevent from matching no files enable this shell option
shopt -s nullglob

# Iterate over the desired path where files are
for file in *; do

# Capture the number from file in loop
    n=${file//[!0-9]}     

# If file has no number and matches your criteria, delete the file
    [[ ! -z $n ]] && (( n < num - 3)) && rm "$file"   
done

将其运行为:

./script.sh file24.txt

答案 1 :(得分:1)

我可能会用Perl脚本执行此操作:

#!/usr/bin/env perl
use strict;
use warnings;

for my $arg (@ARGV)
{
    my($prefix, $number, $suffix) = ($arg =~ m/^ (\D+) (\d+) (\D.*) $/x);
    foreach my $i (1..$number-4)
    {
        my $file = "$prefix$i$suffix";
        unlink $file;
        print "$file\n";
    }
}

对于命令行中指定的每个参数,名称分为3位:非数字的非空前缀,非空数字的数字,以及由非数字组成的后缀按任意字符序列(因此file1.bz2分为file1.bz2)。然后,对于比给定数量少1到4的每个数字,从前缀,当前数字和后缀生成文件名。使用该文件名,取消链接文件并打印名称。您可以调整它以仅删除存在的文件,或不报告名称等等。对文件的最大数量没有固定限制。

您可以省略unlink,只需打印文件名并将其发送到xargs rm -f或等效文件。您可以确保使用空字节终止名称,以便GNU xargs-0选项可以正确处理带有换行符的名称。等

如果你愿意的话,你可以在纯Bash中编码,虽然分成前缀,数字,后缀将比在Perl中更加混乱。我不会使用awk来做这件事,但是如果你选择这样做的话可能会被迫做这个工作。

答案 2 :(得分:1)

我认为这可能是最简单的方法之一:

shopt -s extglob
rm !(file21.txt|file22.txt|file23.txt)

这是一个简单的函数,它以更通用的方式执行此操作:

function rmbut3() {
    for ((n=0 ; n < $(($1 - 3)) ; n++))
    do
        rm file${n}.txt
    done
}

rmbut3 24 # deletes files up to file20.txt