src_dir에서 dst_dir로 디렉토리 구조를 복사하려고 합니다.
내 CentOS 6.4 Linux Bash에서는 이 명령이 제대로 실행됩니다.
[localhost]$ find src_dir
src_dir
src_dir/dir2
src_dir/dir2/dir4
src_dir/dir1
src_dir/dir1/test.txt
src_dir/dir1/dir3
[localhost]$ find src_dir -type d -exec mkdir -p "dst_dir/{}" \;
[localhost]$ find dst_dir
dst_dir/src_dir
dst_dir/src_dir/dir2
dst_dir/src_dir/dir1
dst_dir/src_dir/dir1/dir3
그러나 IBM AIX 6.1에서 동일한 명령을 실행하면 다음과 같은 출력이 나타납니다.
[aix61:/data]find dst_dir
dst_dir
dst_dir/{}
AIX에서는 "find" 명령 매개변수 {} 대체가 약간 다를 수 있습니다.
하지만 어떻게 해결해야 할지 모르겠습니다. 어떤 조언이라도 도움이 될 것입니다.
답변1
예, 구문은 POSIX가 아닙니다. {}
자체 매개변수에 따라 독립 실행형만 확장이 보장됩니다.
사용:
find src_dir -type d -exec sh -c 'for dir do
mkdir -p "dst_dir/$dir"; done' sh {} +
또는 mkdir
디렉터리당 하나씩 실행하지 마세요.
find src_dir -type d -exec sh -c 'for dir do
set -- "$@" "dst_dir/$dir"; shift; done
mkdir -p "$@"' sh {} +
("인수 목록이 너무 큼" 조건이 발생할 위험이 있지만).
dst_dir/src_dir/x/y...
원하는 경우 다음을 수행 dst_dir/x/y...
합니다.
find src_dir -type d -exec sh -c 'for dir do
set -- "$@" "dst_dir${dir#src_dir}"; shift; done
mkdir -p "$@"' sh {} +
디렉토리 경로에 개행 문자가 포함되지 않는다고 보장할 수 있는 경우 다른 옵션은 다음을 사용하는 것입니다 pax
.
find src_dir -type d | pax -rw dst_dir
-pe
이를 통해 소유권 및 권한과 같은 디렉터리 메타데이터를 복사할 수 있습니다(
src_dir
대상에서 선행 구성요소를 제거하려면 다음을 수행하십시오.
find src_dir -path '*/*' -type d | pax -'s@^src_dir/@@' -rw dst_dir
또는:
(cd src_dir && find . -type d | pax -rw ../dst_dir)