列出目录中与字符串匹配的所有文件并复制输出

列出目录中与字符串匹配的所有文件并复制输出

我正在尝试在运行 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

如果这不是您真正想要的,我认为您可以根据您的需要定制这个示例。

相关内容