问题描述
我在一些目录(以及许多其他文件)中获得了一些我想要移动的文件。
幸运的是,我想移动的所有文件都在其名称中包含某个标识符,因此我可以通过ls | grep IDENTIFIER
获取要移动的文件的确切列表。
但是,我怎么能一次执行mv file /path/to/dest/folder/
,而不是一个接一个地执行(有很多文件需要移动)?
最佳解决思路
如果您想移动ABC-IDENTIFIER-XYZ.ext
或IDENTIFIER-XYZ.xml
,您可以使用:
mv *IDENTIFIER* ~/YourPath/
*
是零个或多个字符的通配符,这意味着零个或多个字符,其后是IDENTIFIER
,后跟零个或多个字符。
这将移动包含您指定的IDENTIFIER
的所有文件。
次佳解决思路
你可以使用
mv -t DESTINATION file1 file2 file3
和
mv -t DESTINATION `ls|grep IDENTIFIER`
作品,但我不确定是否多次调用mv,因为grep会为每个匹配输出一个新行。
第三种解决思路
您可以使用wildcards。
例如:移动所有扩展名为.doc的文件
mv *.doc /path/to/dest/folder/
这会将当前目录下的所有doc文件移动到特定目标。
编辑
回答评论。
mv *.ext *.xml *.txt /path/to/dest/folder/
第四种思路
如果您想要移动一组不相关的文件(名称和类型中没有常见模式),您可以像Rajanand先生说的那样执行操作:首先转到包含要移动文件的目录
mv file1.ext1 file2.ext2 file3.ext3.. /destination/
如果文件分散在不同的目录中,则只需在移动命令中指定每个文件的路径
第五种思路
我使用tuomaz的技术,但略有修改:
mv file1 file2 file3 -t DESTINATION
我发现这更容易记住,因为它使用与香草mv操作相同的顺序:
mv file1 DESTINATION
第六种思路
使用此命令:
mv `ls|grep IDENTIFIER` /path/to/dest/folder
但是,ls不推荐用于这种用途。改用find命令。
第七种思路
如果您有太多的文件需要移动,那么对于mv
命令(或其他命令,如rm
),实际上可能有太多文件。我建议使用xargs
以像时尚一样循环移动每个文件。解决这个问题的一种方法是:
ls -1 | grep IDENTIFIER | xargs -i mv {} /path/to/dest/folder/
ls -1
(减一)确保每行只有一个文件名。如果您隐藏了ls
命令的别名,则可以在一行中包含多个文件名,并无意中移动您不打算移动的文件。
第八种思路
您可以使用ls的输出输入到mv commnad中
mv $(ls | grep IDENTIFIER) /path/to/dest/dir
$()
之间的命令返回与您的搜索匹配的文件名列表,并且可以作为mv命令的参数提供。
第九种思路
find -type f -name "[range]" -exec mv {} target-directory ';'
该命令会将文件名以任何模式/范围移动到target-directory。
例如。
find -type f -name "file[1-50000]" -exec mv {} target-directory ';'
它会将名称为file1
,file2
… file50000
的文件移动到target-directory
。