Подтвердить что ты не робот

Bash For-Loop в каталогах

Краткая информация:

$ ls src
file1  file2  dir1  dir2  dir3

Script:

#!/bin/bash

for i in src/* ; do
  if [ -d "$i" ]; then
    echo "$i"
  fi
done

Вывод:

src/dir1
src/dir2
src/dir3

Однако я хочу, чтобы он читал:

dir1
dir2
dir3

Теперь я понимаю, что могу сделать sed/awk для удаления "src/", однако мне любопытно узнать, есть ли лучший способ обойти это. Возможно, вместо этого используйте find-while-loop.

4b9b3361

Ответ 1

Сделайте это вместо строки echo:

 echo $(basename "$i")

Ответ 2

Не нужно искать внешний процесс:

echo "${i##*/}"

Он использует параметр "удалить самый длинный соответствующий префикс" расширение параметра. */ - это шаблон, поэтому он будет удалять все с начала строки до последней косой черты. Если в значении $i нет косой черты, тогда он совпадает с "$i".

Это конкретное расширение параметра указанное в POSIX, и является частью наследия исходной оболочки Bourne. Он поддерживается во всех борнеподобных оболочках (sh, ash, dash, ksh, bash, zsh и т.д.). Многие из богатых функциональными возможностями оболочек (например, ksh, bash и zsh) имеют другие расширения, которые могут обрабатывать еще больше без привлечения внешних процессов.

Ответ 3

Если вы выполните cd в начале script, его следует вернуть, когда script завершает работу.

#!/bin/bash

cd src
for i in * ; do
  if [ -d "$i" ]; then
    echo "$i"
  fi
done

Ответ 4

Используйте basename как:

if [ -d "$i" ]; then
    basename "$i"
fi