많은 파일이 포함된 폴더가 있고 각 폴더에는 동일한 이름의 txt 파일이 있으며 모든 하위 디렉터리의 모든 txt 파일을 하나의 폴더로 병합하고 싶습니다.
예:
/home/parent/Folder1 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder2 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder3 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
같은 이름을 가진 모든 파일을 다른 폴더에 병합하고 싶습니다.
/home/parent/Merged ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
답변1
다음을 사용할 수 있습니다.
mkdir "/home/parent/MERGED"
find "/home/parent/Folder1" -type f -name '*txt' -printf '%f\0' |
xargs -0 -I FILENAME find "/home/parent" ! -path '/home/parent/MERGED/*' \
-type f -name FILENAME\
-exec sh -c 'cat "$1" >> "/home/parent/MERGED/$2"' sh {} FILENAME \;
할 수 있는 작업:
- 대상 디렉터리 생성
- FOLDER1을 스캔하고 파일 이름(경로 없이)을 인쇄한 다음 NUL을 구분 기호로 사용합니다.
- 이 목록을 읽어보세요
xargs
find
각 입력 이름에 대해 한 번 실행하고parent
해당 이름을 가진 파일을 검색합니다.- 이 검색에서 대상 디렉터리 제외
- 결과를 MERGED에 지정된 이름의 파일로 연결합니다.
참고: 출력 파일의 데이터는 반드시 FOLDER1, FOLDER2 등의 이름으로 정렬되는 것이 아니라 find
파일을 검색한 방식으로 정렬됩니다.
참고 2: 병합 디렉터리를 올바르게 필터링하려면 절대 경로가 필요합니다.
답변2
그리고 zsh
:
cd /home/parent && mkdir -p Merged || exit
typeset -A files
for file (Folder*/*.txt(nN)) files[$file:t]+=$file$'\0'
for file (${(k)files}) cat -- ${(0)files[$file]} > Merged/$file
숫자 순서 는 다음 n
과 같이 glob 확장의 glob 한정자에 적용됩니다.Folder2
앞으로 Folder10
그리고 txtfile1.txt
이전 txtfile10.txt
예입니다.
숨겨진 파일은 건너뜁니다. 이들을 병합하려면 D
glob 한정자를 추가하세요.