如何使用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
我还认为还有另一种方法可以完美地满足您的需求。 您可以将find
与while
循环结合使用,甚至根本不需要使用exec
或xargs
。 例如,如果您想将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的详细介绍,请参阅此文章 。