Find
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 中,“查找”命令參數 {} 替換可能有些不同。
但我不知道如何解決它。任何意見將是有益的。
是的,該語法不是 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 {} +
(儘管存在達到“arg list too large”條件的風險)。
請注意,它會創建
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)