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
globstar
Bash 셸 옵션을 활성화합니다 .shopt -s globstar
이제 디렉토리를 B로 변경하고 다음을 실행하십시오.
for path in **/; do
[ -d "<A-dir>/$path" ] && cp -n "$path/"*.build "<A-dir>/$path"
done
그러면 B의 각 하위 디렉터리를 재귀적으로 검사하고 A에 동등한 하위 디렉터리가 있는지 확인합니다. 있는 경우 .build
B 하위 디렉터리의 모든 파일이 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
사용합니다 .mkdcp
cp
-C