![列出目录中与字符串匹配的所有文件并复制输出](https://linux22.com/image/1305531/%E5%88%97%E5%87%BA%E7%9B%AE%E5%BD%95%E4%B8%AD%E4%B8%8E%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E5%B9%B6%E5%A4%8D%E5%88%B6%E8%BE%93%E5%87%BA.png)
我正在尝试在运行 Rockbox 的 MP3 播放器上创建一系列播放列表,方法是使用 查找与字符串匹配的文件find /cygdrive/g/MUSIC -type f -name "Search Criteria" | /cygdrive/g/PLAYLIST/Playlist Name.m3u8
。当我使用 搜索时$ find /cygdrive/g/Music -type f -name "*Theme*"
,我的结果是:
/cygdrive/g/Music/Movie Masterpieces/14 - 1900's Theme.ogg
/cygdrive/g/Music/Movie Masterpieces/02 - Deborah's Theme.ogg
/cygdrive/g/Music/Star Trek_ The Motion Picture [Disc 1]/01 - Ilia's Theme.ogg
但是,我希望能够搜索任何文件夹并输出其中文件的名称,输出类似于以下内容:
/cygdrive/g/Music/Cult Themes/01 - The Avengers (1965).ogg
/cygdrive/g/Music/Cult Themes/02 - Man In A Suitcase (1968).ogg
/cygdrive/g/Music/Cult Themes/03 - The Saint (1962).ogg
我可以访问 Linux 终端、cygwin 或 Windows 命令提示符,如果能提供任何解决方案我将不胜感激,但如果可能的话,最好只用一两行。
编辑:在收到许多解决方案后,我发现最好的解决方案是:
find /cygdrive/g/MUSIC -type d -iname "*theme*" -print -prune
| xargs -d '\n' -I {} find {} -name '*.ogg'
此解决方案能够以最快的速度完成搜索,虽然它可能不像第一个响应那样简短,但仍然简洁。感谢所有响应的人!
答案1
处理输出的正确方法find
是不是 for
,而是逐行阅读:
find . -type d -iname '*themes*' -print -prune |
while read -r path; do
find "$path" -name '*.ogg'
done
或者
find . -type d -iname '*themes*' -print -prune |
xargs -d '\n' -I {} find {} -name '*.ogg'
或者让我们find
这样做:
find . -type d -iname '*themes*' -exec find {} -name '*.ogg' \; -prune
-prune
是针对父目录和子目录同时符合规则的情况的简单保护措施-iname
。
我跳过了传统的,-print0 | xargs -d '\0'
因为带有换行符的文件名在 FAT32 文件系统中不太可能存在。
答案2
以下是搜索目录(例如主题)并列出其下的所有 .ogg 文件(递归)的方法:
for x in $(find . -iname "*themes*"); do find $x -iname "*.ogg"; done
如果这不是您真正想要的,我认为您可以根据您的需要定制这个示例。