다음과 같은 다양한 파일의 위치가 포함된 파일이 있습니다 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