如何将所有匹配某个模式的文件移动到一个文件夹中?

如何将所有匹配某个模式的文件移动到一个文件夹中?
ls | grep 'NC022.*nii'

显示所有包含NC022和 的文件nii

但当我尝试使用

mv NC022.*nii NC022/

它抱怨说

mv: cannot stat 'NC022.*nii': No such file or directory

如果我尝试这样做,也会发生这种情况(如其他答案所示)。

mv -t NC022 'ls | grep 'NC022.*nii''

我很难找出错误所在,因为我感觉自己已经多次做过完全相同的事情,却没有任何错误……

如何将所有匹配某个模式的文件移动到一个文件夹中?

第一个命令的部分 ls 输出示例:

NC022_Background1_Raw import  W325.39 L290.nii
NC022_Background2_Copy (2) of Raw import  W325.39 L290.nii
NC022_Background3_Raw import  W1103.50 L551.nii
NC022_Mask1_mask_air.nii

答案1

您将正则表达式语法(由 使用grep)与 glob 模式(由 shell 使用)相混淆。

在正则表达式中,.表示任意单个字符,*表示零个或多个重复。因此,与之间的任何字符(包括空字符)grep 'NC022.*nii'匹配。NC022nii

相反,.在 shell 通配符中, 是字面量,而*本身表示零个或多个字符。因此,NC022.*nii可以匹配NC022.nii之间的任何字符(包括空字符)。

特别是,如果你尝试匹配所有文件.nii 扩大.位置不对:你应该使用NC022*.niiie

mv NC022*.nii NC022/

答案2

在我们的例子中,问题略有不同。路径中有一个空格,所以我们将整个路径放在引号中。然后mv: cannot stat xxxx': No such file or directory出现相同的错误消息。解决方案是省略引号并屏蔽空格:

前:

mv "/code/API Server/Data/*.rdf" /server/data

解决方案:

mv /code/API\ Server/Data/*.rdf /server/data

也许这会对其他正在寻找此问题的人有所帮助。

相关内容