如何为“ls -1”列出的每个文件查找下一个“n”文件和“n+1”文件

如何为“ls -1”列出的每个文件查找下一个“n”文件和“n+1”文件

在目录中,对于按ls -1 .默认顺序(即字典顺序)列出的每个文件,我想执行以下操作

  1. 找到n从该文件开始并包含该文件的下一个文件,将它们放入名为 的数组中train,并将它们复制到子目录 中tmp

  2. 找到n+1第一个文件,将其放入名为的变量中test

  3. train对、test、 和执行一些操作tmp。删除tmp.

traintest被重用,并且应该被 所列出的每个文件覆盖ls

tmp在开始对 列出的每个文件执行上述步骤之前,应该为空ls

n这三个步骤对除列出的最后一个文件之外的每个文件执行ls,因为没有n+1从每个文件开始的第一个文件。

我想知道如何在bash中实现上述内容?谢谢。

例如,

假设为2,当前目录n下列出的文件有:ls

a
b
c
d
e
f

对于a,我将找到ab并将它们放入数组中train并将它们复制到 dir 中tmp,然后找到c并将其放入变量中test。然后对traintest和执行一些操作tmp。最后,空目录tmp

对于b,我会找到bc,并通过覆盖它们将它们放入数组中train,并将它们复制到 dir 中tmp,然后通过覆盖它查找d并将其放入变量中test。然后对traintest和执行一些操作tmp。最后,空目录tmp

c然后对和执行上述操作d,但不对e和执行f,因为n=2。

答案1

#!/bin/bash

declare -a all
all=(`ls -1 | grep -v '^tmp$'`)
n=2
i=0

while [ $((n+i)) -lt ${#all[*]} ]; do
    declare -a train
    j=0
    while [ $j -lt $n ]; do
            train[$j]=${all[$((i+j))]}
            cp ${all[$((i+j))]} tmp/
            j=$((j+1))
    done
    test=${all[$((i+j))]}
    i=$((i+1))
    # do something:
    echo "loop $i: contents of tmp/ are" $(ls tmp)", test=$test"
    rm -f tmp/*
done

首先将所有文件放入数组中all

现在,当数组中有空间时循环(偏移量i加数字n小于文件列表的长度)。

使用循环将文件名放入从偏移量开始的n数组中,并将文件复制到子目录中。循环结束后,下一个文件名将被放入.trainitmptest

现在“做点什么”。

增加偏移量i并再次循环。

我个人会为此使用 perl。

相关内容