Как мне повторить только имя файла, если я перебираю каталог с помощью цикла for?
for filename in /home/user/*
do
echo $filename
done;
вытянет полный путь с именем файла. Мне просто нужно имя файла.
Как мне повторить только имя файла, если я перебираю каталог с помощью цикла for?
for filename in /home/user/*
do
echo $filename
done;
вытянет полный путь с именем файла. Мне просто нужно имя файла.
Ответы:
Если вам нужно собственное bash
решение
for file in /home/user/*; do
echo "${file##*/}"
done
Вышеупомянутое использует расширение параметров, которое является родным для оболочки и не требует вызова внешнего двоичного файла, такого какbasename
Однако могу ли я предложить просто использовать find
find /home/user -type f -printf "%f\n"
${file##*/}
на "${file##*/}"
поддержку имен файлов с пробелами, например, «Мое имя файла с пробелами.txt».
Просто используйте basename
:
echo `basename "$filename"`
Кавычки необходимы в случае, если $ filename содержит, например, пробелы.
$()
как Оли
/test 1
, basename $(pwd)
выход: test
. Протестировано на OS X и Ubuntu Server (14.04). Нативное решение bash, рекомендованное @SiegeX, - это то, что сработало для меня.
basename "$(pwd)"
вместо этого.
$PWD
вместо запуска команды.
Использование basename
:
echo $(basename /foo/bar/stuff)
echo
? basename
уже печатает результаты. echo
может даже исказить результат, если вы не процитируете подоболочку. Пример: echo $(basename path/with\ \ spaces)
неправильно печатает with spaces
(только один пробел).
Другой подход - использовать ls
при чтении списка файлов в каталоге, чтобы дать вам то, что вы хотите, то есть «только имя файла / s». В отличие от чтения полного пути к файлу с последующим извлечением компонента «имя файла» в теле цикла for.
Пример ниже, следующий за вашим оригиналом:
for filename in $(ls /home/user/)
do
echo $filename
done;
Если вы запускаете сценарий в том же каталоге, что и файлы, он просто становится:
for filename in $(ls)
do
echo $filename
done;
ls
включает любые точечные файлы, которые *
обычно не расширяются. Также for f in $(...) ...
не работает, если любое имя файла содержит пробелы, если вы не установили IFS, может завершиться ошибкой, если любое имя файла содержит символ glob, если вы не установили -f / -o noglob, и в зависимости от системы или оболочки echo
может завершиться ошибкой, если любое имя файла содержит дефис + букву или обратную косую черту. OTOH ls -1 /path/to/dir
сам по себе надежно печатает каждое имя файла в строке по модулю разницы файлов точек.