파일 이름 반복 [닫기]

파일 이름 반복 [닫기]

여러 파일을 입력으로 포함하는 함수를 사용해야 합니다. 파일은 파일 이름으로 연결됩니다(예: dog1_animal.txt, dog2_animal.txt, dog3_animal.txt, cat1_animal.txt, cat2_animal.txt, cat3_animal.txt 등...). 내 생각은 해당 파일의 이름이 비슷한 이름으로 지정되어 있는지 확인하는 것입니다. 패턴, 하지만 요점은 패턴을 작성하고 싶지 않지만 코드는 이러한 파일 중 비슷한 이름을 가진 파일을 식별하여 함수에 보내야 한다는 것입니다. 카테고리당 세 개의 파일이 있습니다. 중첩 루프가 작동할 것이라고 생각했는데 그렇지 않습니다.

for file in *.txt; 
do for file2 in *.txt; 
do for file3 in *.txt;
do if [[ "${file3%_*}" == "${file2%_*}" ]] && [[ "${file3%_*}" == "${file2%_*}" ]] && [[ $file1 != $file3 ]] && [[ $file3 != $file1 ]] && [[ $file3 != $file1 ]]; 
then
        :
fi; 
done;
done;
echo "${file%_*}${file2%_*}${file3%_*}"; ##my supposed comand that 
uses file file2 file 3
done

문제는 모든 파일을 반복하고 비슷한 이름을 가진 파일을 찾아 모든 파일이 처리될 때까지 함수에서 다시 사용해야 한다는 것입니다.

답변1

*.txt항상 세 개로 구성된 그룹의 파일을 사용하고 패턴이 일치한다는 것을 알고 있다고 가정합니다.모두관련 파일(그게 전부입니다)과 파일이 올바르게 정렬되어 있습니다(귀하의 질문에서 언급한 대로).

또한 some_utility한 번에 세 개의 파일 그룹으로 일부 유틸리티를 호출하려는 경우 다음 명령을 사용할 수 있습니다 xargs.

printf '%s\0' *.txt | xargs -0 -n 3 some_utility

그러면 .dll을 사용하여 Null로 구분된 파일 이름 목록이 생성됩니다 printf. 목록은 로 전송되며 xargs, 이는 한 번에 세 개의 이름을 선택하고 some_utility해당 이름을 인수로 사용하여 호출합니다. 유틸리티가 종료되면 다음 세 개의 파일 이름에 대해 동일한 작업을 수행합니다.

테스트(사용됨 echo):

$ touch {dog,cat,mouse,horse}{1..3}_animal.txt     
$ touch {tree,flower}{1..3}_plant.txt
$ printf '%s\0' *.txt | xargs -0 -n 3 echo
cat1_animal.txt cat2_animal.txt cat3_animal.txt
dog1_animal.txt dog2_animal.txt dog3_animal.txt
flower1_plant.txt flower2_plant.txt flower3_plant.txt
horse1_animal.txt horse2_animal.txt horse3_animal.txt
mouse1_animal.txt mouse2_animal.txt mouse3_animal.txt
tree1_plant.txt tree2_plant.txt tree3_plant.txt

위와 동일한 파일을 사용하는 약간 더 복잡한 예:

$ printf '%s\0' *.txt | xargs -0 -n 3 bash -c 'printf "%s %s %s\n" "${@%_*}"' bash
cat1 cat2 cat3
dog1 dog2 dog3
flower1 flower2 flower3
horse1 horse2 horse3
mouse1 mouse2 mouse3
tree1 tree2 tree3

관련 정보