На этот вопрос уже есть ответ здесь:
Я пишу скрипт для получения всех файлов в папке (включая вложенные папки):
#!/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
Как изменить скрипт, чтобы добиться этого?
Почему ты так далеко уходишь, просто будь проще
#!/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"
Надежда, которая помогает;)
В первую очередь, не анализируют 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"