mv:無法統計“文件名_1_2_3”:沒有這樣的文件或目錄
我想從我所在的父目錄下的許多目錄中移動大量文件。
我將以下命令與反引號一起使用:
mv -t directory1/directory2/directory3/ `ls -R | grep _2_3`
所以我想將反引號中的命令源移動到目標目錄“directory3”,它在我的目前目錄下遞歸找到(父目錄)
是否有任何解決方案可以使用目前命令執行此操作?這個錯誤到底是什麼意思?
您會注意到
ls -R
輸出文件名。也就是說,它不輸出pathnames。因此,如果在您的子目錄之一中找到名稱中包含字元串的文件,則在(與文件名在同一行)的輸出中_2_3
沒有關於該文件在何處找到的資訊。ls -R
這會使您的命令失敗(在目前目錄中找不到文件名)。對於名稱中包含空格、製表符或換行符的任何文件,它也會失敗,並且如果任何文件名包含文件名萬用字元,也可能會產生奇怪的結果。相反,假設您要將文件名以結尾的文件移動
_2_3
到一個目錄/directory1/directory2/directory3
(並且該目錄不是目前目錄的子目錄),那麼find . -type f -name '*_2_3' -exec mv -t /directory1/directory2/directory3 {} +
會這樣做。
_2_3
這將找到所有正常文件的路徑名(不是目錄或命名管道,或符號連結等),其名稱以目前目錄中或下的任何位置結尾,並將mv -t /directory1/directory2/directory3
盡可能多地批量執行這些路徑名。在
bash
shell 中,你也可以這樣做shopt -s globstar mv -t /directory1/directory2/directory3 **/*_2_3
除非該模式擴展到數千個名稱。中的
globstar
shell 選項bash
啟用**
globbing 模式。它的工作方式類似,但會在路徑名中*
匹配。因此,它將找到與目前目錄中或下方任何位置匹配的所有名稱。請注意,此命令不關心匹配的名稱類型,並且可能也匹配目錄名稱,例如(但您的方法也會這樣做)。/``*_2_3``ls -R
在
zsh
外殼中,您可以更精確地匹配:mv -t /directory1/directory2/directory3 **/*_2_3(.)
修改前面模式的
(.)
行為以僅匹配正常文件。該**
模式在zsh
.如果您希望查找名稱包含
_2_3
的文件,只需*_2_3
將上述命令中的文件名模式的位更改為*_2_3*
.