percorre todos os arquivos em uma pasta [duplicada]

6

Estou escrevendo um script para obter todos os arquivos dentro de uma pasta (incluindo a subpasta):

#!/bin/bash
function loop() {
files='ls -1Fd '
echo "$files" |
while IFS= read -r file; do
    if [[ "$file" == */ ]]; then
        loop "$file*"
    else
        echo "$file"
    fi
done
}
loop "$PWD/*"

Eu tentei testar o script desta maneira:

#create folders and files
mkdir test\ folder && mkdir test\ folder/test\ subfolder && touch test\ folder/test\ subfolder/test\ file && cd test\ folder

#execute the script
~/path_to_the_script/test.sh

Mas isso não funciona, aqui está o erro:

ls: cannot access /home/user/Documents/test: No such file or directory
ls: cannot access folder/*: No such file or directory

Como modificar o script para alcançá-lo?

    
por Searene 27.09.2015 / 09:35

2 respostas

4

Por que você está indo muito longe, apenas mantenha isso simples

#!/bin/bash
function loop() { 
    for i in ""/*
    do
        if [ -d "$i" ]; then
            loop "$i"
        elif [ -e "$i" ]; then
            echo $i
        else
            echo "$i"" - Folder Empty"
        fi
    done
}
loop "$PWD"

Espero que ajude;)

    
por H. Freeze 27.09.2015 / 11:38
5

Antes de mais nada, não analisa ls . Agora, o motivo do seu script falhar é porque você está passando "$PWD/*" . Como isso é desejado, ele será expandido antes de ser passado para sua função em /path/to/dir/* e, como não há nenhum arquivo chamado * no seu PWD , ele falhará.

No entanto, mesmo que funcionasse, isso o colocaria em um loop infinito.

O que você está procurando é:

#!/bin/bash

function loop() {
    ## Do nothing if * doesn't match anything.
    ## This is needed for empty directories, otherwise
    ## "foo/*" expands to the literal string "foo/*"/
    shopt -s nullglob

    for file in 
    do
    ## If $file is a directory
    if [ -d "$file" ]
    then
            echo "looping for $file"
        loop "$file/*"
    else
            echo "$file"
    fi
    done
}
loop "$PWD/*"

Isso, no entanto, falhará se o seu PWD contiver quaisquer caracteres de espaço em branco. Uma maneira mais segura é:

#!/bin/bash

function loop() {
    ## Do nothing if * doesn't match anything.
    ## This is needed for empty directories, otherwise
    ## "foo/*" expands to the literal string "foo/*"/
    shopt -s nullglob

    ## Make ** recurse into subdirectories
    shopt -s globstar

    for file in "$@"/**
    do
    ## If $file is a file
    if [ -f "$file" ]
    then
        echo "$file"
    fi
    done
}
loop "$PWD"
    
por terdon 27.09.2015 / 11:47