Как мне повторить только имя файла, если я перебираю каталог с помощью цикла 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
:Кавычки необходимы в случае, если $ filename содержит, например, пробелы.
источник
$()
как Оли/test 1
,basename $(pwd)
выход:test
. Протестировано на OS X и Ubuntu Server (14.04). Нативное решение bash, рекомендованное @SiegeX, - это то, что сработало для меня.basename "$(pwd)"
вместо этого.$PWD
вместо запуска команды.Использование
basename
:источник
echo
?basename
уже печатает результаты.echo
может даже исказить результат, если вы не процитируете подоболочку. Пример:echo $(basename path/with\ \ spaces)
неправильно печатаетwith spaces
(только один пробел).Другой подход - использовать
ls
при чтении списка файлов в каталоге, чтобы дать вам то, что вы хотите, то есть «только имя файла / s». В отличие от чтения полного пути к файлу с последующим извлечением компонента «имя файла» в теле цикла for.Пример ниже, следующий за вашим оригиналом:
Если вы запускаете сценарий в том же каталоге, что и файлы, он просто становится:
источник
ls
включает любые точечные файлы, которые*
обычно не расширяются. Такжеfor f in $(...) ...
не работает, если любое имя файла содержит пробелы, если вы не установили IFS, может завершиться ошибкой, если любое имя файла содержит символ glob, если вы не установили -f / -o noglob, и в зависимости от системы или оболочкиecho
может завершиться ошибкой, если любое имя файла содержит дефис + букву или обратную косую черту. OTOHls -1 /path/to/dir
сам по себе надежно печатает каждое имя файла в строке по модулю разницы файлов точек.если вам нужно только имя файла:
подробнее о
cut
команде см. здесь .источник