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)

相关内容