디렉토리에서 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
찾아서 배열에 넣고 dir에 복사한 다음 찾아서 변수에 넣을 것입니다 . 그런 다음 , 및 에 대해 몇 가지 작업을 수행합니다 . 마지막으로 빈 디렉토리 .a
b
train
tmp
c
test
train
test
tmp
tmp
의 경우 및를 b
찾아서 덮어써서 배열에 넣고 dir에 복사한 다음 찾아서 덮어써서 변수에 넣습니다 . 그런 다음 , 및 에 대해 몇 가지 작업을 수행합니다 . 마지막으로 빈 디렉토리 .b
c
train
tmp
d
test
train
test
tmp
tmp
c
그런 다음 =2이기 때문에 합 에 대해서는 위의 작업을 수행하지만 합계에 대해서는 d
수행하지 않습니다 .e
f
n
답변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을 사용할 것입니다.