하위 폴더의 Cat 파일은 목록에 지정된 순서대로 정렬됩니다.

하위 폴더의 Cat 파일은 목록에 지정된 순서대로 정렬됩니다.

ale, bae, galo라는 많은 하위 폴더가 포함된 폴더 x가 있고 각 하위 폴더에 .pest 파일이 있습니다.

x/ale/ale.pest 
x/bae/bae.pest 
x/galo/galo.pest

.pest 파일을 분류해야 하는 순서대로 폴더 y에 목록이 있습니다.

bae
galo
ale

내 x 폴더에서 시도 중입니다.

for file in ./*/*.pest; do while read line; do cat "$line".pest; done; done  <./y/list

하지만 작동하지 않습니다.

답변1

목록에 순서가 있으므로 파일 이름을 파일 이름 와일드카드 패턴과 일치시키지 마십시오. 대신 이름은 목록에서 읽은 문자열로 구성됩니다.

#!/bin/sh

while read -r name; do
    cat "x/$name/$name.pest"
done <y/list >concatenated.pest

이렇게 하면 관련된 모든 파일이 연결되고 에서 지정한 대로 .pest현재 디렉터리에 이러한 파일에서 호출되는 단일 파일이 생성됩니다 .concatenated.pesty/list

몇 가지 점검 사항이 포함되어 있습니다:

#!/bin/sh

while read -r name; do
    pathname="x/$name/$name.pest"

    if [ ! -f "$pathname" ]; then
        printf 'Can not find %s\n' "$pathname"
        echo 'Output file will be incomplete'
        exit 1
    fi >&2

    cat "$pathname"
done <y/list >concatenated.pest

답변2

약간 다른 후속 질문에 대답하려면 다음을 수행하십시오.

내 하위 디렉터리의 이름이 목록의 이름과 같지 않으면 어떻게 되는지 궁금합니다.

몇 가지 가정을 해보자:

  • 모든 하위 레딧은 x공정한 게임입니다.
  • 모든 .pest문서는 공정한 게임입니다.
  • .pest이름이 같지만 디렉터리가 다른 두 개의 파일이 있는 경우 두 파일이 편집되는 순서는 신경 쓰지 않아도 됩니다 cat.

그렇다면 당신은:

while read -r name; do
    cat x/*/"$name.pest"
done <y/list >concatenated.pest

온전성 검사를 추가하는 것은 조금 더 까다롭지만 여전히 가능합니다. (내 가정이 귀하의 사용 사례에 맞는지 모르기 때문에 이 부분은 다루지 않겠습니다.)

답변3

여러 파일을 제공할 수 있으므로 cat경로 이름을 수정한 후 하나의 인스턴스만 시작하는 것이 가장 좋습니다.

sed 's|.*|x/&/&.pest|' < y/filename-list.txt | xargs -d '\n' cat

설명하다:

  • sed 's|A|B|'A의 모든 항목을 바꿉니다 B.

    • 여기서 A는 .*길이나 내용에 관계없이 모든 문자 시퀀스와 일치합니다.

    • &B에서는 A와 일치하는 전체 텍스트에 대한 자리 표시자입니다.

  • xargs [OPTIONS...] COMMAND [ARGS...]COMMAND [ARGS...]표준 입력 스트림에 토큰을 추가하여 명령을 실행합니다.

    • 일반적으로 토큰은 공백 문자 수에 관계없이 구분됩니다. 를 사용하면 다른 구분 기호(이 경우 개행 문자) 를 사용하라는 -d의미입니다 .xargs\n

    • xargs설치에서 이를 지원하지 않는 경우 -d입력 토큰에 공백이 포함되어 있지 않은지 확인해야 합니다. Linux에서는 일반적 xargs으로 -d.

관련 정보