Bash For-Loop для каталогов - PullRequest
       13

Bash For-Loop для каталогов

32 голосов
/ 25 октября 2010

Быстрый фон:

$ ls src
file1  file2  dir1  dir2  dir3

Сценарий:

#!/bin/bash

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

Выход:

src/dir1
src/dir2
src/dir3

Тем не менее, я хочу это прочитать:

dir1
dir2
dir3

Теперь я понимаю, что могу удалить вывод команды «src /», однако мне любопытно узнать, есть ли лучший способ сделать это. Возможно, вместо этого используйте цикл find + while.

Ответы [ 4 ]

20 голосов
/ 25 октября 2010

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

 echo $(basename "$i")
13 голосов
/ 25 октября 2010

Нет необходимости разветвлять внешний процесс:

echo "${i##*/}"

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

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

8 голосов
/ 25 октября 2010

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

#!/bin/bash

cd src
for i in * ; do
  if [ -d "$i" ]; then
    echo "$i"
  fi
done
4 голосов
/ 25 октября 2010

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

if [ -d "$i" ]; then
    basename "$i"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...