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

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

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

感谢您的支持。

答案1

命令是:

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

答案2

还有另一种方法,我认为它非常适合您的目的。您可以将其findwhile循环结合使用,甚至不需要使用其中任何一个execxargs根本不需要使用。例如,如果您想mp3s将下载文件夹复制到音乐文件夹,则可以使用以下脚本,我已经多次使用过该脚本。

您可以通过更改搜索和放置结果文件的目录来修改它find;如果没有指定目录,find将搜索整个主文件夹。您也可以更改cpmv或其他命令。它非常快,因为我刚刚用 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命令的更多常规信息,请在终端中输入man find或查看Ubuntu 在线手册页有关 find 用法的详细介绍,请参阅本文也一样。

相关内容