파일 목록을 기반으로 파일 위치 및 내용 출력

파일 목록을 기반으로 파일 위치 및 내용 출력

다음과 같은 다양한 파일의 위치가 포함된 파일이 있습니다 locationfile.txt.

/home/user/documents/file1
/home/user/file2
/home/user/file3

각 텍스트 파일에는 약 10줄이 있으며 모든 파일을 finalfile.

내가 만약 그렇게 한다면

cat locationfile.txt | while read line; do cat "$line"; done

그러면 모든 파일이 함께 인쇄되어 약 30줄의 텍스트 파일이 됩니다.

내 질문은 다음과 같이 텍스트 사이에 파일 위치가 있는 파일 출력을 어떻게 포함할 수 있는지입니다.

/home/user/documents/file1
text
text
text
""
/home/user/file2
text
text
text
""
/home/user/file3
text
text
text
""

답변1

파일 이름에 대해 OR 연산을 cat수행하기 전에 echo:printf

while read line; do printf '%s\n' "$line"; cat "$line"; done <locationfile.txt >finalfile

또는 더 읽기 쉽게 하려면 다음을 수행하세요.

while read line; do
  printf '%s\n' "$line"
  cat "$line"
done <locationfile.txt >finalfile

이를 위해서는 모든 경로에 locationfile.txt경로가 없어야 한다는 점에 유의하십시오 \.

경로 이름에 포함하는 것은 매우 드문 일 이지만 \그렇게 하는 것이 더 안전합니다.

while read -r line; do
  printf '%s\n' "$line"
  cat "$line"
done <locationfile.txt >finalfile

...동일한 제한은 없습니다.

파일이 실제로 존재하는지 확인하고 존재하지 않으면 경고를 출력하는 검사를 추가합니다.

while read -r line; do
  if [[ -f "$line" ]]; then
    printf '%s\n' "$line"
    cat "$line"
  else
    printf 'Warning: "%s" does not exist\n' "$line" >&2
  fi
done <locationfile.txt >finalfile

여기서 "존재하지 않는다"는 것은 "적어도 일반 파일이 아님"을 의미합니다.

""일종의 파일 내용 종료 태그로 사용하려면 다음 뒤에 넣으 세요 cat.

while read -r line; do
  if [[ -f "$line" ]]; then
    printf '%s\n' "$line"
    cat "$line"
    echo '""'
  else
    printf 'Warning: "%s" does not exist\n' "$line" >&2
  fi
done <locationfile.txt >finalfile

마지막으로, 자체 문서화 이름을 지정하십시오.

while read -r file_path; do
  if [[ -f "$file_path" ]]; then
    printf '%s\n' "$file_path"
    cat "$file_path"
    echo '""'
  else
    printf 'Warning: "%s" does not exist\n' "$file_path" >&2
  fi
done <file_paths.txt >files_concat_with_paths.txt

답변2

while read file; do
    ( echo "$file"; cat "$file"; echo '"""' ) >> /path/to/outputfile
done < /path/to/filelist

답변3

GNU awk가 있는 경우 쉘 루프를 완전히 피할 수 있는 옵션은 다음과 같습니다.

xargs -d '\n' -a locationfile.txt gawk 'BEGINFILE{print FILENAME} 1' > newfile

또는 GNU sed를 사용하십시오:

xargs -d '\n' -a locationfile.txt sed -s '1F' > newfile

파일 이름의 정확한 형식에 관심이 없다면 다음 트릭을 사용할 수 있습니다 head.

xargs -d '\n' -a locationfile.txt head -vn -0 > newfile

( 처음 0을 제외한 모든 라인, 즉 모든 라인을 출력 -n -0하도록 지시합니다 .)head

답변4

echo "$line"루프에 다음을 추가할 수 있습니다 .

cat locationfile.txt | while read line; do echo "$line" && cat "$line"; done

관련 정보