IBM AIX find src_dir -type d -exec mkdir -p "dst_dir/{}" \;작동하지 않습니다.

IBM AIX find src_dir -type d -exec mkdir -p "dst_dir/{}" \;작동하지 않습니다.

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)

관련 정보