如何使用shell搜索所有子目录中的文件,然后复制这些文件?

如何在包含多个子目录的目录中使用递归命令(如ls -R *.mp3找到* .mp3文件,最后将这些文件复制到我选择的目录中。

感谢您的支持。

命令是:

 find /path/to/directory -name "*.mp3" -exec cp {} /some/other/dir/ \; 

替代方案:

 find /path/to/dir/ -name '*.mp3' | xargs cp -t /target/ 

例:

 alex@MaD-pc:~/test$ ls 1 2 3 alex@MaD-pc:~/test$ ls 1 2 3 1: 1.txt 2.mp3 3.txt 2: 4.txt 5.mp3 6.txt 3: alex@MaD-pc:~/test$ find . -name "*.mp3" -exec cp {} 3/ \; alex@MaD-pc:~/test$ ls 3 2.mp3 5.mp3 

欲获得更多信息:

 man find 

我还认为还有另一种方法可以完美地满足您的需求。 您可以将findwhile循环结合使用,甚至根本不需要使用execxargs 。 例如,如果您想将mp3s从下载文件夹复制到音乐文件夹,则可以使用以下脚本,我多次使用过该脚本。

您可以通过更改find搜索的目录并将生成的文件放入其中来修改它。 如果没有说明目录, find将搜索整个主文件夹。 您还可以将cp更改为mv或其他命令。 这是非常快的,因为我刚用3945 .jpg文件测试它! 将其复制到文本编辑器中,保存它,然后通过运行chmod +x myscript使其可执行。

 #!/bin/bash # a script to recursively find and copy files to a desired location find ~/Downloads -type f -iname '*.mp3' -print0 | while IFS= read -r -d '' f; do cp -- "$f" ~/Music ; done 

在这个着名的Bash wiki中 ,显示了将while循环和read命令组合起来处理find命令的输出是多么有用。 我完成它的方式确保如果遇到带有空格或其他意外或特殊字符的文件名,脚本不会中断。

有关find命令的更多常规信息,请在terminal man find输入或在线查看Ubuntu联机帮助页 。 有关使用find的详细介绍,请参阅此文章 。