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

gil*_*och 185 command-line mv

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

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

但是,我怎样才能mv file /path/to/dest/folder/一次执行,而不是一个一个执行(有很多文件要移动)?

小智 260

你可以使用:

mv -t DESTINATION file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

以下也有效,但我不确定是否mv多次调用,因为grep将为每个匹配输出一个新行:

mv -t DESTINATION  `ls|grep IDENTIFIER`
Run Code Online (Sandbox Code Playgroud)

  • 不适用于 Mac (10.11.16 El Capitan)。但是你可以简单地把目标文件夹放在后面,即`mv file1 file2 ... destination` (17认同)
  • 适用于 linux,不确定它是否适用于 mac (7认同)
  • [为什么你不应该解析 `ls` 的输出](http://mywiki.wooledge.org/ParsingLs)。 (7认同)
  • 通过 git for windows 在 mac 和 git bash 上工作。 (4认同)
  • -1 表示第二种方法,因为它适用于包括 _new lines_ 在内的文件 (3认同)

Eva*_*lva 122

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

mv *IDENTIFIER* ~/YourPath/
Run Code Online (Sandbox Code Playgroud)

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

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


Ach*_*chu 30

您可以使用通配符

例如,要移动所有具有.doc扩展名的文件:

mv *.doc /path/to/dest/folder/
Run Code Online (Sandbox Code Playgroud)

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

编辑

要回答评论:

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

mv *.ext  *.xml *.txt /path/to/dest/folder/
Run Code Online (Sandbox Code Playgroud)

  • 但要移动的文件列表不是由扩展名决定的。一些文件被命名为:“ABC-IDENTIFIER-XYZ.ext”和一些只是“IDENTIFIER-XYZ.ext”,它们都有不同的扩展名,主要是“xml”或“properties”。 (2认同)

小智 28

如果您想移动一组任意文件(名称和类型没有共同模式),您可以按照 Rajanand 先生说的进行:首先转到包含您要移动的文件的目录

mv file1.ext1 file2.ext2 file3.ext3 /destination/
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

mv file1 file2 file3 -t DESTINATION
Run Code Online (Sandbox Code Playgroud)

我发现这更容易记住并且更难搞砸,因为它使用与 vanilla mv 操作相同的顺序:

mv file1 DESTINATION
Run Code Online (Sandbox Code Playgroud)


Sru*_*uli 10

如果文件在同一个目录中,您可以使用

mv /path/to/source/dir/{file1,file2,*.ext1,*.ext2} /path/to/destination/
Run Code Online (Sandbox Code Playgroud)

(在 Ubuntu 16.04 中测试)


ign*_*ite 5

使用这个命令:

mv `ls|grep IDENTIFIER` /path/to/dest/folder  
Run Code Online (Sandbox Code Playgroud)

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

  • 不建议将 `ls` 用于这种用途。如果要列出文件,尤其是后面有 `grep` 的文件,请使用 `find 。-name \*IDENTIFIER\*`。 (10认同)
  • 正如@NorTicUs 所说,不建议使用 ls。此外,带有空格的文件可能会导致问题。 (4认同)
  • [不要解析`ls`](http://mywiki.wooledge.org/ParsingLs) (2认同)

小智 5

find -type f -name "[range]" -exec mv {} target-directory ';'
Run Code Online (Sandbox Code Playgroud)

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

例如。

find -type f -name "file[1-50000]" -exec mv {} target-directory ';'
Run Code Online (Sandbox Code Playgroud)

它将把名称为file1, file2... 的文件移动file50000target-directory.