我在要移动的某个目录(以及许多其他文件)中有一堆文件。

幸运的是,我要移动的所有文件的名称中都包含一个特定的标识符,因此我可以ls | grep IDENTIFIER获取要移动的文件的确切列表。

但是,如何立即执行mv file /path/to/dest/folder/,而不是一个接一个地执行(有很多文件要移动)?

#1 楼

如果要移动ABC-IDENTIFIER-XYZ.extIDENTIFIER-XYZ.xml,可以使用:

mv *IDENTIFIER* ~/YourPath/


*是零个或多个字符的通配符,表示零个或多个字符,后跟IDENTIFIER ,后跟零个或多个字符。

这将移动包含您指定的IDENTIFIER的所有文件。

#2 楼

您可以使用

mv -t DESTINATION file1 file2 file3



mv -t DESTINATION `ls|grep IDENTIFIER`

有效,但是我不确定是否调用了mv是否多次重复,因为grep将为每个匹配项输出新行。

评论


在Linux上工作,不确定是否在Mac上工作

–亚历山大·米尔斯(Alexander Mills)
16 Dec 10'在20:25

适用于Mac和git bash,适用于Windows的git。

–布兰特·索洛维(Brandt Soloviy)
17年2月23日在12:55

在Mac(10.11.16 El Capitan)上无法使用。但是您只需将目标文件夹放在后面,即mv file1 file2 ... destination

–乔纳森·H
17年7月23日在15:29



-1为第二种方法,因为它将落入包含换行符的文件中

–αғsнιη
17年7月7日在15:33

为什么不应该解析ls的输出。

–甜点
17年12月1日在9:42

#3 楼

您可以使用通配符。

示例:移动所有扩展名为.doc的文件

mv *.doc /path/to/dest/folder/

这会将当前目录下的所有doc文件移动到特定的目标位置。

编辑

来回答评论。

mv *.ext *.xml *.txt /path/to/dest/folder/

评论


但是要移动的文件列表不是由扩展名决定的。一些文件被命名为:ABC-IDENTIFIER-XYZ.ext,还有一些只是IDENTIFIER-XYZ.ext,它们都具有不同的扩展名,主要是xml或属性。

– Gilad Hoch
2012年11月8日13:25

@giladhoch编辑的怎么样?

–阿楚
2012年11月8日13:36

@gliadhoch如果您对使用grep非常满意,则可以在上方/下方看到我的答案。

–点燃
2012年11月8日13:47

因为还有其他.xml文件(例如),我不想移动,因此无法使用。

– Gilad Hoch
2012年11月8日13:50

#4 楼

如果要移动一组不相关的文件(名称和类型中没有通用模式),可以按照拉贾南德先生所说的进行:
首先转到包含要移动文件的目录

mv file1.ext1 file2.ext2 file3.ext3.. /destination/


如果文件分散在不同的目录中,则只需在移动命令中为每个文件指定路径

评论


只要/ destination /已经存在(在Mac OS X和Alpine Linux上进行测试),此方法就可以工作(注意:这是对我之前删除的注释的更正)

–马特·布朗(Matt Browne)
19-10-24在19:19

#5 楼

我使用tuomaz的技术,但稍作修改:

mv file1 file2 file3 -t DESTINATION


我发现此方法更容易记住,更难理解,因为它使用与香草mv操作相同的顺序:

mv file1 DESTINATION


评论


mv的手册页没有提到-t选项。

–本体
16-10-24在3:25

linux.die.net/man/1/mv是的

–geoyws
17年2月20日在4:00

#6 楼

如果文件位于同一目录中,则可以使用

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/


(在Ubuntu 16.04中测试)

评论


这实际上并没有为现有答案添加任何内容,您认为吗?

–甜点
17年12月1日在9:46

只是消除了为每个文件指定目录的完整路径的需要

–斯鲁利
17年12月1日在11:22



#7 楼

使用以下命令:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  


但是,不建议将ls用于这种用途。请改用find命令。

评论


不建议将ls用于这种用途。如果要列出文件,尤其是后面带有grep的文件,请使用find。 -名称\ * IDENTIFIER \ *。

– NorTicUs
2012年11月8日13:48

这个答案只是为了演示如何在mv中使用上一个命令的输出。正如在问题中提到ls | grep一样,我只是复制了它。

–点燃
2012年11月8日13:50

如@NorTicUs所述,不建议使用ls。另外,带空格的文件可能会引起问题。

–帕迪·兰道(Paddy Landau)
2012年11月13日14:27

不要解析ls

–詹娜♦
17年7月7日在15:15

#8 楼

如果要移动的文件太多,则实际上mv命令(或其他命令,例如rm)可能有太多文件。我建议使用xargs以类似循环的方式分别移动每个文件。解决该问题的一种方法是:

ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/


ls -1(减一)可确保每行只有一个文件名。如果您对ls命令具有隐藏的别名,则可以在一行上包含多个文件名,并且无意间移动了您不想移动的文件。

评论


当您的IDENTIFIER难以转换为通配符,或者您想将grep与更复杂的正则表达式一起使用时,这也很有用。

– AggieBill
2012年11月14日上午10:11

+1代表xargs。 find几乎总是比ls更安全。找 。标识符-exec mv {} / path / to / dest / folder \; (未测试的代码)。用于当前工作目录。 \;是结束要执行的命令。根据您的操作,您可能必须添加-maxdepth 1以防止其递归到​​子目录中。

–乔
2012年11月14日23:33



在Mac OS上获取非法选项-i

–詹姆斯·坎贝尔
20-09-28在14:38

#9 楼

您可以使用ls的输出输入到mv commnad

mv $(ls | grep IDENTIFIER) /path/to/dest/dir

$()之间的命令返回与您的搜索匹配的文件名列表,可以将其提供为mv命令的参数。

评论


不要解析ls

–詹娜♦
17年7月7日在15:14

工作很好,谢谢

–詹姆斯·坎贝尔
20-09-28在14:42

#10 楼

find -type f -name "[range]" -exec mv {} target-directory ';'


此命令会将具有任何模式/范围的文件名移动到目标目录。

例如

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'


它将名称为file1file2 ... file50000之类的文件移动到target-directory

#11 楼

最简单的方法是这样

mv {file1,file2,file3} DESTINATION


或目录

mv {directory1,directory2,directory3} DESTINATION


或文件和目录

mv {file1,file2,file3,directory1,directory2,directory3} DESTINATION


希望对您有所帮助

#12 楼

使用此命令可以移动多个文件。

mv SourceFilenames ~DestinationPath

#13 楼

如果您使用的是fish shell,那么大多数事情都是幸运的。如此简单,只需将目标位置键入最后一个文件即可。

mv file1 file2 file3 DESTINATION


#14 楼

您可以像这样使用find-exec

find . -name "Identifier" -exec echo mv {} <destination_path> \;