Script Bash: subdiretório parse e diretórios não atuais

0

Estou tentando analisar nomes de subdiretórios, mas a saída divide os nomes em palavras individuais.

Se o nome do subdiretório for "Hello World", a saída será:

.  
Hello  
World  

O código a seguir funciona, mas a saída inclui o diretório atual, que eu não quero:

find "$my_dir" -maxdepth 1 -type d -print0 |
    while IFS= read -rd '' dir;
        do 
            echo "$dir"; 
        done

Estou tentando incluir uma instrução if que elimina o diretório atual da saída, mas parece que o código ainda vê palavras individuais para cada nome de subdiretório:

find "$my_dir" -maxdepth 1 -type d -print0 |  
    while IFS= read -rd '' dir;
        do 
            if ["$dir" != "."]; then
                echo "$dir"
            fi
        done
    
por Yu Buntu 31.08.2018 / 02:08

2 respostas

0

A quebra nos espaços ocorre no comando read , mas você não precisa disso de qualquer maneira. Além disso, sua lógica if é falha. Só funcionaria se my_dir fosse igual a . , caso contrário, find não geraria . em sua saída. Finalmente, você afirma no seu exemplo, que você quer apenas os nomes dos diretórios, não o caminho completo, mas da maneira como você o escreveu, find passaria o caminho para o stdout.

Aqui está uma solução mais fácil:

find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2

O truque aqui é o comando tail . Você deseja excluir o diretório inicial ( $my_dir ) da saída. find sempre gera este diretório primeiro (a menos que você requeira explicitamente o primeiro sentido de profundidade), então você simplesmente precisa descartar a primeira linha da saída resultante.

    
por 31.08.2018 / 08:31
0

Se você tiver, use a opção -mindepth , que pode ser usada aqui para excluir o diretório mais importante em sua árvore

find "$my_dir" -mindepth 1 -maxdepth 1 -type d -print0

No entanto, como você também tem -maxdepth limitando a profundidade, por que não usar apenas um for loop

for dir in "$my_dir"/*
do
    [[ -d "$dir" ]] || continue    # only directories
    echo "${dir/*\/}"              # just basename
done
    
por 31.08.2018 / 09:16