수천 개의 .txt 파일이 서로 연결되어 있지만 필요한 경우 디렉터리로 돌아가서 파일을 볼 수 있도록 각 .txt 파일의 텍스트 위에 경로를 작성하고 싶습니다.
예:
file1.txt의 내용은 다음과 같습니다.
id: 1234
info: 1234
id: abcd
info: abcd
file1.txt의 경로는 pathto/dir1/sub1/file1.txt입니다.
file2.txt의 내용은 다음과 같습니다.
id: 5678
info: 5678
file2.txt의 경로는 pathto/dir2/sub2/file2.txt입니다.
연결된 .txt 파일의 형식은 다음과 같아야 합니다.
pathto/dir1/sub1/file1.txt
id: 1234
info: 1234
id: abcd
info: abcd
pathto/dir2/sub2/file2.txt
id: 5678
info: 5678
개별적으로 연결하면 연결된 각 .txt 파일 사이의 경로가 인쇄되지 않습니다. 이것이 제가 원하는 것입니다.
또한 ~/를 CD pathto/
하고 거기에서 "file.txt" 파일에 대한 모든 하위 디렉터리를 재귀적으로 검색하는 명령을 실행해야 합니다.
답변1
쉘이 기본적으로 작동하는 것처럼 들립니다.
#!/bin/bash
shopt -s globstar nocaseglob nullglob
for file in **/file.txt **/files.txt; do
printf '---------------------\n' >> allfiles.txt
printf '%s' "${file}" >> allfiles.txt
printf '---------------------\n' >> allfiles.txt
cat "${file}" >> allfiles.txt
done
답변2
디렉터리 수준까지 반복하고, 각 하위 디렉터리 그룹을 반복하고, 파일을 반복합니다. 이 같은
for topdir in */
do
top=${topdir%/}
top=${top##*/}
for subdir in "$topdir"/*/
do
sub=${subdir%/}
sub=${sub##*/}
printf -- '-%s\n--%s\n\n' "$top" "$sub"
for file in "$subdir"/*
do
[ -f "$file" ] && cat <"$file"
done
done
done >output_file
파일을 연결하려고만 했는지 확인하기 위해 파일 사이에 명시적인 루프를 사용했습니다. 각 하위 디렉터리에 파일만 있다고 확신하는 경우 이를 생략할 수 있습니다.
수정된 질문에 답변하기 위해 훨씬 더 짧은 솔루션을 제공할 수 있습니다. 이는 현재 디렉토리에서 호출된 파일을 검색 file.txt
하고 해당 파일을 해당 경로명과 연결합니다 output_file
.
find . -type f -name 'file.txt' -exec sh -c 'for f in "$@"; do printf "%s\n\n" "${f#./}"; cat "$f"; echo; done' _ {} + >output_file
답변3
귀하의 질문과 의견에 따르면 해당 폴더로 이동하여 다음을 수행하는 것으로 보입니다.
cat filename* > concatenatedfile.txt
기본적으로 모든 것이 filename
.
pwd
먼저 명령을 사용한 다음 실행하여 cat
파일 맨 위에 경로를 넣은 다음 파일에 연결을 추가할 수 있습니다.
pwd > concatenatedfile.txt
cat filename* >> concatenatedfile
이렇게 하면 현재 있는 폴더의 경로가 포함된 concatenatedfile.txt를 만든 다음 >>
파일 이름으로 시작하는 모든 파일의 내용을 동일한 파일에 추가하기만 하면 됩니다.
>
파일 내용 덮어쓰기
>>
파일 끝에 추가하고 파일 상단의 내용은 변경하지 않고 그대로 둡니다.
답변4
최종 효과는 다음과 같습니다.
find . -type f -iname 'file.txt' -printf '\n%P\n' -exec cat {} \; > catfile.txt
대소문자 구분 없이 모든 제목이 포함된 파일을 찾아 file.txt
데이터를 catfile.txt
.
모두의 도움에 감사드립니다!