Lista todos os arquivos em um diretório correspondente a uma string e saída de cópia

1

Estou tentando criar uma série de listas de reprodução no meu player de MP3, executando o Rockbox, encontrando um arquivo correspondente a uma string, usando find /cygdrive/g/MUSIC -type f -name "Search Criteria" | /cygdrive/g/PLAYLIST/Playlist Name.m3u8 . Quando pesquiso usando $ find /cygdrive/g/Music -type f -name "*Theme*" , meus resultados são:

/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

No entanto, eu gostaria de poder procurar por qualquer pasta e enviar os nomes dos arquivos para dentro, para uma saída similar a:

/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

Eu tenho acesso a um terminal Linux, cygwin ou prompt de comando do Windows e ficaria grato por qualquer solução, mas se possível em uma ou duas linhas.

Editar: depois de receber o número de soluções, descobri que a melhor solução foi:

find /cygdrive/g/MUSIC -type d -iname "*theme*" -print -prune 
| xargs -d '\n' -I {} find {} -name '*.ogg'

Esta solução foi capaz de completar a busca mais rapidamente e, embora não seja tão breve quanto a primeira resposta, ainda é sucinta. Obrigado a todos que responderam!

    
por jClark94 20.02.2012 / 18:08

2 respostas

3

O caminho certo para processar find output não é for , mas para lê-lo linha a linha:

find . -type d -iname '*themes*' -print -prune |
while read -r path; do
    find "$path" -name '*.ogg'
done

ou

find . -type d -iname '*themes*' -print -prune |
xargs -d '\n' -I {} find {} -name '*.ogg'

ou deixe find fazer isso:

find . -type d -iname '*themes*' -exec find {} -name '*.ogg' \; -prune

-prune é uma proteção simples contra casos em que um diretório pai e um subdiretório correspondam à regra -iname .

Eu pulei o tradicional -print0 | xargs -d '%code%' , pois nomes de arquivos com caracteres de nova linha são muito improváveis de existir em um sistema de arquivos FAT32.

    
por 20.02.2012 / 22:39
1

Aqui está a maneira de procurar por um diretório (por exemplo, temas) e listar todos os arquivos .ogg sob ele (recursivamente):

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

Acho que você pode personalizar este exemplo para suas necessidades, se não for exatamente o que você quer.

    
por 20.02.2012 / 18:40