使用 cp 從包含空目錄的目錄複製檔案也會導致錯誤傳回值,這會導致我的腳本失敗。
有沒有辦法讓它跳過目錄而沒有錯誤回傳值?我希望錯誤值能夠反映任何錯誤,但其中有一個空目錄應該被跳過,而不會被報告為錯誤。
我可以添加遞歸標誌-r
,但如果我只是不想複製目錄怎麼辦,但我做想要回報任何錯誤嗎?
答案1
我建議您使用 rsync 而不是 cp,如果可以的話,它有選項 -m 來排除空資料夾,例如:
rsync -am <origin> <destination>
該命令的解釋在解釋shell.com
我使用 -a 選項,因為它執行了很多很好的預設操作,但如果您願意,也可以使用 -r 選項,這將僅設定遞歸模式。
[新增評論]
我不知道如何使用 cp 執行此操作,至少手冊頁沒有顯示任何可以為您執行此操作的選項。您可能可以透過使用命令來find
尋找要複製的檔案/目錄列表,然後將其傳遞給 cp 來實現更複雜的解決方案,但這比 rsync 複雜得多。 rsync 在許多 Linux 中甚至幾乎是標準配置
答案2
cp
確實沒有隻獲取文件的選項,但作為狂暴說,你可以find
與 一起使用cp
。事實上,這非常簡單:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
或者:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
解釋
find
是尋找您想要的文件的工具。在第一個選項中,我們設定-type f
為僅返回常規檔案。在第二個選項中,我們設定-not -type d
來取得目錄以外的所有內容。一次執行傳遞給取代一個結果條目的find
參數,並在找到時停止命令(應該轉義or ,否則 shell 可能會展開它)。-execdir
{}
;
;
\;
";"
-execdir
將運行將文件的資料夾作為其“工作目錄”的命令,並且最好而不是-exec
,請檢查下面。
選項-type
文件:
-C型
文件類型為 c:
b:塊(緩衝)特殊
c:字元(無緩衝)特殊
d:目錄
p:命名管道(先進先出)
f:常規文件
l:符號連結;如果 -L 選項或 -follow 選項有效,則這永遠不會成立,除非符號連結已損壞。如果要在 -L 生效時搜尋符號鏈接,請使用 -xtype。
s: 插座
D:門(Solaris)
選項-not
文件:
!表達式
如果 expr 為假,則為真。該字元通常還需要保護以免受 shell 的解釋。
-不是表達式
與...一樣 ! expr,但不符合 POSIX 標準。
選項-execdir
文件:
-執行命令 ;
執行命令;如果傳回 0 狀態則為 true。 find 的所有以下參數都被視為命令的參數,直到出現由 ';' 組成的參數遇到。字串「{}」將被替換為正在處理的目前檔案名稱(在命令 [...] 的參數中出現的所有位置)。這兩種結構可能都需要轉義(使用“\”)或引用,以防止它們被 shell 擴展。對於每個匹配的文件,指定的命令運行一次。該指令在起始目錄中執行。使用 -exec 操作存在不可避免的安全性問題;您應該使用 -execdir 選項。
-execdir命令 ;
與-exec類似,但指定命令從包含匹配文件的子目錄運行,這通常不是您開始尋找的目錄。這是一種更安全的呼叫命令的方法,因為它避免了解析匹配檔案的路徑期間的競爭條件。 [...] 如果使用此選項,則必須確保 $PATH 環境變數不引用「.」;否則,攻擊者可以透過在要執行 -execdir 的目錄中保留適當命名的檔案來執行他們喜歡的任何命令。這同樣適用於 $PATH 中的條目為空或不是絕對目錄名稱。