如何一次将多个文件移动到特定的目标目录?


152

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

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

但是,如何才能mv file /path/to/dest/folder/一次执行而不是一一执行(要移动的文件很多)?

Answers:


100

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

mv *IDENTIFIER* ~/YourPath/

*为通配符零个或多个字符,这意味着零个或多个字符,然后IDENTIFIER,随后的零个或多个字符

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


201

你可以用

mv -t DESTINATION file1 file2 file3

mv -t DESTINATION `ls|grep IDENTIFIER`

可以,但是我不确定mv是否被多次调用,因为grep将为每个匹配项输出新行。


5
可以在linux上运行,不确定是否可以在mac上运行
Alexander Mills

3
可以通过git在mac和git bash上用于windwows。
Brandt Solovij '17

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

2
-1第二种方法,因为它会爱上文件,包括新线
αғsнιη


24

您可以使用通配符

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

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

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

编辑

回答评论。

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


2
但是要移动的文件列表不是由扩展名决定的。其中一些文件被命名为:ABC-IDENTIFIER-XYZ.ext有些文件IDENTIFIER-XYZ.ext全部具有不同的扩展名,大多数为xmlproperties
吉拉德·霍奇(

@giladhoch编辑的怎么样?
2012年

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

由于没有其他.xml文件(例如),我不想移动,因此无法使用。
吉拉德·霍奇(gilad hoch)2012年

20

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

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

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



7

使用以下命令:

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

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


8
ls不建议用于这种用途。如果要列出文件,尤其是grep后面列出的文件,请使用find . -name \*IDENTIFIER\*
NorTicUs 2012年

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

3
如@NorTicUs所述,不建议使用ls。此外,带空格的文件可能会引起问题。
帕迪·兰道


5

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

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

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


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

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

5

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

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

(在Ubuntu 16.04中测试)


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

1
只是消除了为每个文件指定dir的完整路径的必要
Sruli

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

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

例如。

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

它会移动文件有相似的名字file1file2... file50000target-directory


2

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

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

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



1

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

mv SourceFilenames ~DestinationPath


1

最简单的方法是这样的

mv {file1,file2,file3} DESTINATION

或目录

mv {directory1,directory2,directory3} DESTINATION

或文件和目录

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

希望这可以帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.