1

Я пытаюсь создать серию плейлистов на моем MP3-плеере с Rockbox, найдя файл, соответствующий строке, используя 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'

Это решение смогло завершить поиск быстрее, и, хотя оно может быть не таким кратким, как первый ответ, оно все еще лаконично. Спасибо всем, кто откликнулся!

2 ответа2

3

Правильный способ обработки результатов 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.

1

Вот способ найти каталог (например, темы) и перечислить все файлы .ogg под ним (рекурсивно):

for x in $(find . -iname "*themes*"); do find $x -iname "*.ogg"; done

Я думаю, что вы можете настроить этот пример для своих нужд, если это не то, что вы хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .