Find

IBM AIX find src_dir -type d -exec mkdir -p ‘dst_dir/{}’ ;不工作

  • November 16, 2017

我正在嘗試將目錄結構從 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)

引用自:https://unix.stackexchange.com/questions/404950