Если есть только одно имя файла, которое не начинается с .
, то:
filename="$(ls $directory)"
Это захватывает вывод ls
. Из-за ограничения «один файл», это безопасно, даже если имя содержит символы новой строки, пробелы, табуляции или что-то еще. С несколькими файлами парсинг вывода ls
проблематичен.
Если вы хотите указать путь, а не просто имя файла, вы можете использовать:
filename=$directory/*
Опять же, это безопасно только из-за ограничения «один файл». Невозможно использовать это, чтобы различить «в каталоге есть один файл с его именем *
» и случай ошибки «в каталоге вообще нет файлов». С ls
, если строка пуста, файл отсутствует.
Если имя файла может начинаться с .
, тогда жизнь намного сложнее; вы, вероятно, используете:
filename=$(cd $directory; basename "$(find . -type f)")
Еще раз, это безопасно только из-за ограничения «один файл». Если файлов может быть несколько, вам нужно использовать другие методы.