цикл для файла с определенным расширением в сценарии оболочки дочерней папки

У меня есть сценарий на моем Mac, в котором я пытаюсь зациклить текстовые файлы внутри подпапки моего текущего местоположения. Это myscript.sh :

cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt 
do 
echo $entry
done

выводит строку пути, включая * txt , например / Users / Desktop / txt / *. Txt Я хочу зациклить файлы .txt, поэтому ожидаю, что echo $ entry напечатает имена файлов txt, но вместо этого напечатает / Users / Desktop / txt / *. Txt

0
30.03.2017, 23:48
1 ответ

Если вы зададите оболочке шаблон подстановки, который не соответствует ни одному имени файла, шаблон подстановки не будет расширен. В вашем случае это означает, что echo в цикле выводит сам шаблон.

Альтернативная реализация вашего скрипта:

cd /Users/Desktop || exit 1

for entry in txt/*.txt; do 
    test -e "$entry" && echo "$entry"
done

Эта реализация завершится с ненулевым кодом выхода, если cd не работает. Тогда он не будет использовать pwd, поскольку в этом нет необходимости. Он получит список имен, соответствующих шаблону, и будет перебирать их. На каждой итерации он проверяет, действительно ли в файловой системе есть что-то с таким именем, прежде чем выводить это имя на стандартный вывод.

Если вы хотите, чтобы echo внутри lop выводил полный путь к файлам, используйте echo "/Users/Desktop/$entry" или еще лучше:

dir="/Users/Desktop"
cd "$dir" || exit 1

for entry in txt/*.txt; do 
    test -e "$entry" && printf '%s/%s\n' "$dir" "$entry"
done
2
28.01.2020, 02:33

Теги

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