识别目录并使用 find in bash 移动内容

Identify a directory and move content with find in bash

我想将某些特定目录的所有文件移动到另一个名为 shp_all 的目录。 所讨论的特定目录是所有包含名称中带有 "shp" 的文件的目录。 该目录如下所示:

 -data
 --shp_all
 --d1
 --d2
   ...
 --dN

我设法找到了一种方法来识别所有目录,在 d1,...,dN 中有名称为 "shp":

的文件
 find . -name '*shp*' 

但是,我不知道如何正确使用execexecdir来获取所有与输出相同目录中的文件和将它们移动到 shp_all

以下是尝试过但没有奏效的方法:

find . -name '*shp*'   -execdir mv '{}/*' shp_all ';' 

你这里有个小问题,你的目标路径./shp_all/在你搜索的路径之内。这会给您带来麻烦,因为文件可能会在 find 开始搜索文件夹之前移动到文件夹中。
我建议在文件选择/移动期间将其移出。
以下代码段应 运行 来自您上面描述的 ./data 文件夹。

mv ./shp_all ..
find . -name "*shp*" -exec mv {} ../shp_all/ \;

find最后的\;重要关闭-exec否则命令执行失败

希望对您有所帮助。
戴夫

我认为一种方法如下(请记住上面 Dave 提出的将目标目录移出 find 路径的建议):

mv $(find . -name "*shp*" -printf "%h\n" | uniq)/* ../shp_all/

请注意,这也会移动任何子目录。如果你真的只想要文件,你可以添加另一个级别来只找到 -type f:

mv $(find $(find . -name "*shp*" -printf "%h\n" | uniq) -type f) ../shp_all/