여러 하위 디렉터리에 있는 여러 파일을 하위 디렉터리당 1개의 파일로 병합하고 원본 파일을 삭제합니다.

여러 하위 디렉터리에 있는 여러 파일을 하위 디렉터리당 1개의 파일로 병합하고 원본 파일을 삭제합니다.

나는디렉토리 구조

DIR
        SUBDIR1
                    11-01-11.txt
                    13-05-23.txt

        SUBDIR2
                    12-05-56.txt
                    13-04-02.txt
                    15-04-06.txt

이를 달성하기 위해 bash 스크립트를 작성하고 싶습니다원하는 출력

DIR
        SUBDIR1
                    sub_dir1_merged.txt

        SUBDIR2
                    sub_dir2_merged.txt

원래 디렉터리 구조를 유지하고, 각 파일을 sub_dirname_merged.txt 파일로 병합하고, 원본 파일을 모두 삭제하고 싶습니다.

나는 다음을 시도했다암호

for f in */
do
cat $f/*.txt > "$f"/$f_merged.txt
rm $f/*.txt 
done

이것은 제대로 작동하지 않습니다.

답변1

스크립트:

for f in */*.txt; do 
  cat "$f" >> "$(dirname "$f")/$(dirname "$f")_merged.txt" 
  rm "$f"
done

하위 디렉터리의 txt 파일 반복:

for f in */*.txt; do 

$(dirname "$f")

파일 이름과 파일 저장 경로 모두에 사용되는 txt가 있는 폴더의 이름을 반환합니다.


rm "$f"

파일을 삭제합니다. 명령을 사용하려는 경우 rm스크립트를 실행하기 전에 스크립트 결과가 예상한 것과 같은지 확인하십시오.

답변2

find로고와 함께 사용 하실 수 있습니다 . -execdir다음과 같이 간단해집니다.

find DIR/ -type f -execdir bash -c 'cat -- $1 >> "${PWD##*/}_merged.txt"' _ {} \;

위 코드 줄을 약간 수정하여 원본 파일을 삭제했습니다.

find DIR/ -type f -execdir bash -c 'for f; do cat -- $f >> "${PWD##*/}_merged.txt"; done;  [[ $f != *${PWD##*/}* ]] && rm -v "$f"' _ {} \;

관련 정보