在目录中,对于按ls -1 .
默认顺序(即字典顺序)列出的每个文件,我想执行以下操作
找到
n
从该文件开始并包含该文件的下一个文件,将它们放入名为 的数组中train
,并将它们复制到子目录 中tmp
。找到
n+1
第一个文件,将其放入名为的变量中test
train
对、test
、 和执行一些操作tmp
。删除tmp
.
train
和test
被重用,并且应该被 所列出的每个文件覆盖ls
。
tmp
在开始对 列出的每个文件执行上述步骤之前,应该为空ls
。
n
这三个步骤对除列出的最后一个文件之外的每个文件执行ls
,因为没有n+1
从每个文件开始的第一个文件。
我想知道如何在bash中实现上述内容?谢谢。
例如,
假设为2,当前目录n
下列出的文件有:ls
a
b
c
d
e
f
对于a
,我将找到a
和b
并将它们放入数组中train
并将它们复制到 dir 中tmp
,然后找到c
并将其放入变量中test
。然后对train
、test
和执行一些操作tmp
。最后,空目录tmp
。
对于b
,我会找到b
和c
,并通过覆盖它们将它们放入数组中train
,并将它们复制到 dir 中tmp
,然后通过覆盖它查找d
并将其放入变量中test
。然后对train
、test
和执行一些操作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
数组中,并将文件复制到子目录中。循环结束后,下一个文件名将被放入.train
i
tmp
test
现在“做点什么”。
增加偏移量i
并再次循环。
我个人会为此使用 perl。