IBM AIX localize src_dir -tipo d -exec mkdir -p “dst_dir / {}” \; não funciona

2

Estou tentando copiar a estrutura de diretórios de src_dir para dst_dir.

No meu Bash do CentOS 6.4 Linux, este comando funciona bem.

[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  

Mas, quando estou fazendo o mesmo comando no IBM AIX 6.1, obtive esta saída

[aix61:/data]find dst_dir    
dst_dir    
dst_dir/{} 

Talvez a substituição do parâmetro de comando {} de localização seja diferente no AIX.
Mas eu não sei como resolver isso. Qualquer conselho seria útil.

    
por Daniel Yun 16.11.2017 / 09:21

1 resposta

3

Sim, essa sintaxe não é POSIX. Somente um {} (em seu próprio argumento) autônomo tem a garantia de ser expandido.

Uso:

find src_dir -type d -exec sh -c 'for dir do
  mkdir -p "dst_dir/$dir"; done' sh {} +

Ou para evitar a execução de um mkdir por diretório:

find src_dir -type d -exec sh -c 'for dir do
  set -- "$@" "dst_dir/$dir"; shift; done
  mkdir -p "$@"' sh {} +

(embora exista o risco de atingir a condição "lista de argumentos muito grande").

Observe que isso criaria dst_dir/src_dir/x/y... . Se você quisesse dst_dir/x/y... , você faria:

find src_dir -type d -exec sh -c 'for dir do
  set -- "$@" "dst_dir${dir#src_dir}"; shift; done
  mkdir -p "$@"' sh {} +

Outra opção, se você pode garantir que os caminhos de diretório não contenham caracteres de nova linha, seria usar pax :

find src_dir -type d | pax -rw dst_dir

Isso permitiria que você também copiasse os metadados dos diretórios, como propriedade e permissões (com -pe )

Para remover o componente principal src_dir no destino:

find src_dir -path '*/*' -type d | pax -'s@^src_dir/@@' -rw dst_dir

Ou:

(cd src_dir && find . -type d | pax -rw ../dst_dir)
    
por 16.11.2017 / 10:59

Tags