Bash

**/ 不適用於已安裝的捲

  • January 9, 2014

我正在嘗試使用 SMB1 從已安裝的捲中遞歸地提取一組 .jpgs 到我電腦上的文件夾中。這是我所擁有的:

cp -a **/97*.jpg /Users/.../All_Covers

只要我的目前目錄和圖像位於我的電腦上的某個位置,這就會起作用,但是一旦我cd進入包含實際圖像的目錄所在的已安裝卷,它就會失敗,給我一個:

cp: **/97*.jpg: No such file or directory

為什麼會失敗?有解決方法嗎?

根據man bash

globstar
                 If set, the pattern ** used in a pathname expansion context will match all files and zero or more directories and  sub‐
                 directories.  If the pattern is followed by a /, only directories and subdirectories match.

換句話說,如果你有 cd’d 到帶有 jpgs 的目錄,那麼沒有一個會匹配,因為**/97*.jpg只匹配子目錄中的 jpgs。

解決方法:使用find

find . -name '*.jpg' -exec cp -a -t destination/ {} +

這將查找*.jpg目前目錄 ( .) 下任意深度的所有文件並將它們複製到destination/.

該選項-t dir告訴cp將文件複製到目標dir。如果您cp不支持,有一個解決方法:

find . -name '*.jpg' -exec cp -a {} destination/ \;

這比以前的版本“效率”低,因為cp它在每個文件 ( {}) 上執行,而不是對所有可以適應命令行 ( {} +) 的文件名只執行一次。

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