перебор всех файлов в папке [дубликат]

На этот вопрос уже есть ответ здесь:

Я пишу скрипт для получения всех файлов в папке (включая вложенные папки):

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

Я пытался протестировать скрипт таким образом:

#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

Но он не работает, вот ошибка:

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

Как изменить скрипт, чтобы добиться этого?

6
задан 27 September 2015 в 00:35

2 ответа

Почему ты так далеко уходишь, просто будь проще

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

Надежда, которая помогает;)

4
ответ дан 23 November 2019 в 07:31

В первую очередь, не анализируют ls . Теперь, причина, которую приводит к сбою Ваш сценарий, состоит в том, потому что Вы передаете "$PWD/*". Поскольку это - qupted, он будет расширен, прежде чем он будет передан Вашей функции к /path/to/dir/* и так как нет никакого файла, названного * в Вашем PWD, он перестал работать.

Однако, даже если бы это работало, который получил бы Вас в бесконечный цикл.

то, Что Вы ищете:

#!/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 $1
    do
    ## If $file is a directory
    if [ -d "$file" ]
    then
            echo "looping for $file"
        loop "$file/*"
    else
            echo "$file"
    fi
    done
}
loop "$PWD/*"

, Который, однако, перестанет работать, если Ваш PWD будет содержать какие-либо пробельные символы. Более безопасный путь:

#!/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"
6
ответ дан 23 November 2019 в 07:31

Другие вопросы по тегам:

Похожие вопросы: