我有一系列格式为 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
答案 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
分为file
,1
和.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