复制具有多个扩展名的文件


22

我想将具有多个扩展名的文件复制到单个目标目录。

例如,我可以使用以下命令将工作目录中的所有.txt文件复制到名为的目录中destination

cp -v *.txt destination/

我可以使用以下命令将工作目录中的所有.png目录复制到destination

cp -v *.png destination/

但是将它们作为单独的命令键入非常耗时(即使使用命令历史记录也是如此)。因此,有什么办法可以告诉我cp将带有模式*.txt 模式的文件复制*.pngdestination 理想情况下,我想能够指定两个以上的模式-就像指导cp复制所有*.txt *.png *.jpg文件destination,例如。

我确信使用shell脚本可以实现所有这些功能- bash例如,我正在使用-但是有什么方法可以仅通过控制台更简单地完成它吗?我能以某种方式使用括号扩展吗?

我知道这是可能的所有文件复制除了匹配某些特定模式的工作目录,但由于我的工作目录含有更多的文件扩展名,我希望比我复制这样做,那将是一个痛苦。

您对此有什么想法吗?


10
cp -v *.txt *.png destination/
iruvar

Answers:


55

括号扩展将完成工作。 man bash并搜索Brace Expansion

cp *.{txt,jpg,png} destination/

编辑:

为了符合OP的要求,上面的命令缺少详细选项:

cp -v *.{txt,jpg,png} destination/

2
我可以在Windows上执行此操作吗?
sergiol

如果可以cp data/images/*.{jpg,jpeg,png,mp4} destination/,但mp4文件不存在,则会出现No such file or directory错误,该错误会破坏脚本。我可以使多个扩展名正常处理任何丢失的格式吗?
BradGreens

1
@BradGreens您应该真正发布一个新问题,而不是在评论中询问。您的问题甚至可能已经有了答案。发布新问题不仅会为您提供答案,而且其他需要相同帮助的人也可以搜索到。
蒂莫西·马丁

0
for filename in /Photos/directory/* ; do
    filenameWithoutPath="${filename##*/}"
    first_num="${filenameWithoutPath%%.*}"
    last_num="${filenameWithoutPath##*.}"
    cp $filename /Photos/directory/$first_num-$last_num.jpg
done

就是这样!

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.