"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.

train재사용 되며 test나열된 모든 파일에 의해 재정의되어야 합니다 ls.

tmp나열된 각 파일에 대해 위 단계를 시작하기 전에 비어 있어야 합니다 ls.

n시작할 첫 번째 파일이 ls없기 때문에 나열된 마지막 파일을 제외한 모든 파일에 대해 이 세 단계가 수행됩니다 .n+1

위의 내용을 bash에서 구현하는 방법을 알고 싶습니다. 감사해요.

예를 들어,

2를 가정하면 n현재 디렉터리에 나열된 파일은 다음과 같습니다.ls

a
b
c
d
e
f

의 경우 이를 a찾아서 배열에 넣고 dir에 복사한 다음 찾아서 변수에 넣을 것입니다 . 그런 다음 , 및 에 대해 몇 가지 작업을 수행합니다 . 마지막으로 빈 디렉토리 .abtraintmpctesttraintesttmptmp

의 경우 및를 b찾아서 덮어써서 배열에 넣고 dir에 복사한 다음 찾아서 덮어써서 변수에 넣습니다 . 그런 다음 , 및 에 대해 몇 가지 작업을 수행합니다 . 마지막으로 빈 디렉토리 .bctraintmpdtesttraintesttmptmp

c그런 다음 =2이기 때문에 합 에 대해서는 위의 작업을 수행하지만 합계에 대해서는 d수행하지 않습니다 .efn

답변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을 사용할 것입니다.

관련 정보