동일한 디렉토리 구조 간에 동일한 확장자를 가진 모든 파일을 복사하는 방법은 무엇입니까?

동일한 디렉토리 구조 간에 동일한 확장자를 가진 모든 파일을 복사하는 방법은 무엇입니까?

A, B 폴더가 2개 있습니다. B에는 많은 확장자가 있습니다 .build. A에는 B의 하위 디렉터리와 동일한 구조를 가진 fe 하위 디렉터리가 있습니다.

예를 들어 A에는 가 있고 some_path/Tools/Camera/B에는 가 있습니다 different_path/Tools/Camera. 동일한 구조를 가진 2개의 하위 디렉터리(하나는 A에, 다른 하나는 B에 있음)를 수동으로 식별하고 B의 하위 디렉터리에서 A의 하위 디렉터리로 모든 .build 파일을 복사해야 한다고 가정합니다.

어떻게 해야 합니까?

답변1

globstarBash 셸 옵션을 활성화합니다 .shopt -s globstar

이제 디렉토리를 B로 변경하고 다음을 실행하십시오.

for path in **/; do
    [ -d "<A-dir>/$path" ] && cp -n "$path/"*.build "<A-dir>/$path"
done

그러면 B의 각 하위 디렉터리를 재귀적으로 검사하고 A에 동등한 하위 디렉터리가 있는지 확인합니다. 있는 경우 .buildB 하위 디렉터리의 모든 파일이 A로 복사 됩니다 .

답변2

이를 수행하는 방법에는 여러 가지가 있습니다.

나는 하나를 생각했다.

cd different_path
find . -iname '*.build' | while read filename ; do 
    cp -n "$filename" "some_path/${filename#./}" 
done

이름에 줄 바꿈이나 이와 유사한 이름이 포함된 부적절하게 이름이 지정된 파일이 있을 가능성이 있는 경우 null 구분 기호를 사용할 수 있습니다.

cd different_path
find . -iname '*.build' -print0 | while IFS= read -r -d $'\0' filename ; do 
    cp -n "$filename" "some_path/${filename#./}" 
done

답변3

그리고 zsh:

autoload -Uz zmv # best in ~/.zshrc
zmv -C 'A/(**/)(*.build)' 'B/$1$2'

해당 하위 디렉터리가 존재하는지 보장할 수 없는 경우 B다음과 같이 변경할 수 있습니다.

mkdcp() { mkdir -p -- $2:h && cp -- "$@"; }
zmv -P mkdcp 'A/(**/)(*.build)' 'B/$1$2'

파일을 복사하기 위해 (with ) 대신 함수를 zmv사용합니다 .mkdcpcp-C

관련 정보