Как мне повторить только имя файла, если я перебираю каталог с помощью цикла 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сам по себе надежно печатает каждое имя файла в строке по модулю разницы файлов точек.