큰 디렉터리 트리를 재동기화하는 방법은 있지만 정규식과 일치하는 리프 디렉터리만 동기화합니까?

큰 디렉터리 트리를 재동기화하는 방법은 있지만 정규식과 일치하는 리프 디렉터리만 동기화합니까?

예를 들어 설명하는 것이 더 쉽습니다. 내 디렉터리 구조가 다음과 같다고 상상해 보세요.

pics/cats/png/01.png
pics/cats/png/02.png
pics/cats/jpg/01.jpg
pics/cats/jpg/02.jpg
pics/dogs/png/01.png
pics/dogs/png/02.png
pics/dogs/jpg/01.jpg
pics/dogs/jpg/02.jpg

"pics" 디렉터리를 대상에 동기화하고 싶지만 대상에서는 리프 디렉터리의 필터 문자열이 "png"라고 가정하고 다음과 같은 결과를 원합니다.

pics/cats/png/01.png
pics/cats/png/02.png
pics/dogs/png/01.png
pics/dogs/png/02.png

또한 다음 결과를 얻고 싶습니다. (png 디렉토리가 더 이상 필요하지 않기 때문에)

pics/cats/01.png
pics/cats/02.png
pics/dogs/01.png
pics/dogs/02.png

문자열 "png"는 모든 디렉터리에 포함될 수 있지만 리프 디렉터리, 즉 다른 디렉터리가 포함되지 않은 디렉터리만 "필터링"하고 싶습니다.

또한 "png" 디렉터리에 png가 아닌 파일이 포함되어 있더라도 "png" 디렉터리의 내용을 보존하고 싶습니다. 즉:

pics/cats/png/01.png
pics/cats/png/02.txt
pics/cats/jpg/01.jpg
pics/cats/jpg/02.jpg
pics/dogs/png/01.txt
pics/dogs/png/02.png
pics/dogs/jpg/01.jpg
pics/dogs/jpg/02.jpg

이 되다:

pics/cats/png/01.png
pics/cats/png/02.txt
pics/dogs/png/01.txt
pics/dogs/png/02.png

또는:

pics/cats/01.png
pics/cats/02.txt
pics/dogs/01.txt
pics/dogs/02.png

마지막 참고사항: 디렉토리 구조는 'n' 깊이일 수 있습니다. 즉:

pics/cats/house/tabby/png/01.png
pics/cats/house/tabby/png/02.txt
pics/cats/house/tabby/jpg/01.jpg
pics/cats/house/tabby/jpg/02.jpg

이 되다:

pics/cats/house/tabby/png/01.png
pics/cats/house/tabby/png/02.txt

또는:

pics/cats/house/tabby/01.png
pics/cats/house/tabby/02.txt

쉬운 방법이 존재하지 않는다면 bash 스크립트를 작성하여 이를 수행할 수 있을 것이라고 확신합니다. 그러나 이는 흔하지는 않지만 때때로 나타날 것으로 확신하는 사용 사례인 것 같습니다. 이 작업에 대한 이름과 플래그가 있습니다.

답변1

당신은 할 수모든 리프 노드 가져오기, 이를 필터링 grep하고 결과를 파일에 저장하는 데 사용합니다.

그런 다음 rsync--files-from옵션을 사용하여 실행합니다.

이것들은 단지 기본 사항입니다. 예를 들어 직접 필터링 awk하거나 . xargs간결하거나 효율적으로 설명하려는 것이 아니라 관련된 단계를 보여주려는 것입니다.

계층 구조의 루트에 있는 경우:

$ find . -type d | sort | awk '$0 !~ last "/" {print last} {last=$0} END {print last}' | grep '/png$' > /tmp/dirs_rsync.txt

$ rsync -av --files-from=/tmp/dirs_rsync.txt . /your/destination/folder

관련 정보