僅 cp 文件,跳過目錄

僅 cp 文件,跳過目錄

使用 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 中的條目為空或不是絕對目錄名稱。

https://linux.die.net/man/1/find

相關內容