![IBM AIX find src_dir -type d -exec mkdir -p "dst_dir/{}" \;不起作用](https://linux22.com/image/121814/IBM%20AIX%20find%20src_dir%20-type%20d%20-exec%20mkdir%20-p%20%22dst_dir%2F%7B%7D%22%20%5C%3B%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在尝试将目录结构从 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)