2017-10-12 1 views
0

문제가 있습니다. 나는 많은 파일을 가진 폴더가 있고 나는 나의 파일 중 2 개의 파일의 모든 조합에 프로그램을 실행할 필요가있다.배쉬리스트를 반복하고 두 요소의 모든 가능한 조합을 얻는 방법?

내 리눅스 bash는 스크립트는 지금까지 다음과 같습니다

for ex in $(ls ${ex_folder}/${testset_folder} | sort -V); do 
    #ex is the name of my current file 
    #I would like to do something like a nested loop where 
    # ex2 goes from ex to the end of the list $(ls ${ex_folder}/${testset_folder} | sort -V) 
done 

나는이 같은 것을 보일 것 다른 언어로, bash는 새로운 해요 :

for i in [0,N] 
    for j in [i,N] 
    #the combination would be i,j 

파일 내 목록의 모양을

ex_10.1 ex_10.2 ex_10.3 ex_10.4 ex_10.5

그리고 내가 원하는 다음 그 중 두 파일의 모든 조합에 대한 파이썬 프로그램을 실행 (그래서 내 프로그램을 10 번 실행)

도움을 주셔서 감사합니다!

+0

예, 'for'루프는 중첩 될 수 있습니다. 각각에 대해'do/done' 문을 닫아야합니다. 그게 당신을 도울 정도로 충분하지 않다면, 말하지 않은 파일에 대해 뭔가가 있습니다. 작은 파일 이름 집합을 포함하도록 Q를 업데이트하고 결합 방법을 표시하십시오. 행운을 빕니다. – shellter

+0

(btw, 질문에 대한 답변이 충분하지 않지만'ls'의 구문 분석은 피해야합니다. '(http://mywiki.wooledge.org/ParsingLs)). –

답변

3

우리가 인덱스 배열을 사용하고 반복하면 쉽게 전사되어 설명하는 논리 : 안전 악성 파일 이름이나 버그를 주입하는 것을 허용하지 않는 방식으로 (sort -V을 구현

files=(*)          # Assign your list of files to an array 
max=${#files[@]}         # Take the length of that array 

for ((idxA=0; idxA<max; idxA++)); do    # iterate idxA from 0 to length 
    for ((idxB=idxA; idxB<max; idxB++)); do   # iterate idxB from idxA to length 
    echo "A: ${files[$idxA]}; B: ${files[$idxB]}" # Do whatever you're here for. 
    done 
done 

으로 배열에 추가 항목), 우리와 그 초기 할당 라인을 대체 할 것 논리 가깝다에 : 줄 바꿈과는 달리, UNIX 좋에서 문자로 존재하지 수있는 (NUL 기호를 사용

files=() 
while IFS= read -r -d '' file; do 
    files+=("$file") 
done < <(printf '%s\0' * | sort -V -z) 

... lenames)를 사용하여 스트림의 이름을 sort과 구분합니다.

+0

매력처럼 작동합니다, 감사합니다! – Roulbacha

관련 문제