Como posso filtrar o diretório atual ('.') no bash?

0

Atualmente, estou tentando escrever um pequeno script para converter todos os arquivos flac em arquivos mp3. No entanto, tive um pequeno problema ao tentar configurar a recursão em todas as minhas pastas de música - o script continuava fazendo loop no diretório atual (.)

Veja o que eu tenho atualmente:

#!/bin/bash

#---
# flacToMp3: Converts FLAC files in my originalFLAC folder into mp3 files
#            and places them in an identical folder structure in my Music
#            folder.
#---

function enterDIR {
    for DIR in "$(find . -maxdepth 1 -type d)"; do #recurse into every directory below top-level directory
        if [ "$DIR" == "." ]; then  #avoid current directory infinite loop
            continue
        fi
        cd "$DIR/"
        enterDIR
    done

    createDirectory
    convertFLAC
}

function createDirectory {
    #recreate directory structure in Music folder
    curDir="$pwd"
    newDir=${curDir/originalFLAC/Music}
    mkdir -p $newDir
}

function convertFLAC {
    #convert each flac file in current directory into an mp3 file
    for FILE in "$(find . -maxdepth 1 -type f)"; do #loop through all regular (non-directory) files in current directory
        if [ "${FILE: -5}" == ".flac" ]; then #if FILE has extension .flac
            ffmpeg -i "$FILE" -ab 320k -map_metadata 0 "${FILE%.*}.mp3"; #convert to .mp3
            mv -u "${FILE%.*}.mp3" $newDir
        else #copy all other files to new directory as-is
            cp -ur "$FILE" $newDir
        fi
    done
}

enterDIR

Esse script é bem desajeitado, já que comecei a mergulhar no Bash. O problema (ou pelo menos onde eu acho que é) vem da linha if [ "$DIR" == "." ]; then - olhando para a minha saída ao executar o script, ele não parece filtrá-lo.

Como faço para filtrar (ignorar) o diretório atual?

    
por DaimyoKirby 22.01.2016 / 16:25

2 respostas

4

Você pode filtrá-lo em find usando a opção -mindepth . Assim:

function enterDIR {
    find . -mindepth 1-maxdepth 1 -type d | while read DIR ; 
    do 
        #recurse into every directory below top-level directory
        cd "$DIR/"
        enterDIR
    done

    createDirectory
    convertFLAC
}

Mas todo o script não parece uma boa solução.

Se eu entendi a sua idéia correta, você quer percorrer toda a árvore de diretórios, criar um novo diretório, converter flac para mp3 se houver e copiar todos os arquivos não-flac para um novo diretório. Eu faria assim:

find . -mindepth 1 -type -d -exec mkdir -p {}/originalFLAC/Music \+
find . -type f -iname "*.flac" -exec ffmpeg -i {} -ab 320k -map_metadata 0 {}.mp3 \;
find . -type f ! -iname "*.flac" | while read file ; do cp -v "$file" "$(dirname "$file")"/originalFLAC/Music/ ; done
    
por 22.01.2016 / 16:41
-1

tente substituir isso

for DIR in "$(find . -maxdepth 1 -type d)"

com isso

for DIR in "$(find . -maxdepth 1 -type d | grep -v "\.$")"

. é interpretado como "qualquer" caractere único em regex. Então tem que ser escapado com barra invertida. Além disso, como todas as suas linhas começarão com um caractere de ponto, você precisará encontrar a linha que contém o ponto e apenas o ponto. Daí o final do caractere de linha $ .

neste ponto, você não precisará do bloco if abaixo:

    if [ "$DIR" == "." ]; then  #avoid current directory infinite loop
        continue
    fi
    
por 22.01.2016 / 16:33