txt 파일을 연결하고 디렉터리 이름을 유지합니다.

txt 파일을 연결하고 디렉터리 이름을 유지합니다.

수천 개의 .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.

모두의 도움에 감사드립니다!

관련 정보