Linux

mv:無法統計“文件名_1_2_3”:沒有這樣的文件或目錄

  • January 24, 2019

我想從我所在的父目錄下的許多目錄中移動大量文件。

我將以下命令與反引號一起使用:

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盡可能多地批量執行這些路徑名。

bashshell 中,你也可以這樣做

shopt -s globstar
mv -t /directory1/directory2/directory3 **/*_2_3

除非該模式擴展到數千個名稱。中的globstarshell 選項bash啟用**globbing 模式。它的工作方式類似,但會路徑名中*匹配。因此,它將找到與目前目錄中或下方任何位置匹配的所有名稱。請注意,此命令不關心匹配的名稱類型,並且可能也匹配目錄名稱,例如(但您的方法也會這樣做)。 /``*_2_3``ls -R

zsh外殼中,您可以更精確地匹配:

mv -t /directory1/directory2/directory3 **/*_2_3(.)

修改前面模式的(.)行為以僅匹配正常文件。該**模式在zsh.

如果您希望查找名稱包含 _2_3的文件,只需*_2_3將上述命令中的文件名模式的位更改為*_2_3*.

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