Bash
**/ 不適用於已安裝的捲
我正在嘗試使用 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
它在每個文件 ({}
) 上執行,而不是對所有可以適應命令行 ({} +
) 的文件名只執行一次。