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.pest
y/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
.