Проверьте, существует ли в bash каталог, соответствующий определенным критериям - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь заставить bash проверить, существует ли каталог, но только если он соответствует определенным критериям.

Например, я хочу проверить, существует ли каталог, начинающийся с pkg_, с любыми другими символами после него.

Таким образом, если папка с именем pkg_1.0 или pkg_2.0 существует, bash все равно ее поймает.

На данный момент код выглядит примерно так:

if [ -d "~/pkg_*" ];

но каждый раз, когда он запускается, он возвращает false независимо от существования какого-либо каталога, начиная с pkg_

В то же время, использование cd ~/pkg_* прекрасно работает, и я могу cd в этот каталог.

Ответы [ 4 ]

0 голосов
/ 30 апреля 2018

Я действительно зависит от того, где вам нужно искать каталоги. Если вам просто нужно проверить, есть ли в одном каталоге pkg_... именованные каталоги, то вы можете использовать цикл for, циклически проходящий по каталогам в данном каталоге, как указывает IObO в своем ответе.

Если, однако, вам нужно искать во всех подкаталогах данного каталога каталоги с именем pkg_..., то использование find предоставляет удобную опцию. В bash вы можете использовать процесс подстановки для подачи имен каталогов, соответствующих вашим критериям, в цикл while, например

while read -r pkgdir; do
    ## do what you need with "$pkgdir"
done < <(find /path -type d -name "pkg_*")

( примечание: необходим пробел между < <)

Команда find найдет все каталоги -type d ниже /path, где имя соответствует глобу "pkg_*". Они будут прочитаны циклом while в переменную pkgdir. Затем вы можете обработать каталог в "$pkgdir" любым необходимым способом.

Вы также можете использовать опцию -exec, чтобы найти для выполнения любую требуемую команду или для вызова другого сценария в каждом каталоге. Вы также можете перенаправить результаты в xargs и выполнить то же самое (предложите использовать -print0 в find для вывода имен каталогов с нулевым символом в конце и параметр -0 для xargs, чтобы указать то же самое)

Дайте мне знать, если у вас есть другие вопросы.

0 голосов
/ 30 апреля 2018

Вы можете сделать это так.

#!/bin/bash

    fpath=`find ~/ -type d -name "pkg_*"` #which finds all folder start the name pkg_ in the path ~/

Для выполнения отдельных действий для каждой папки

for fnd in $fpath
do
    echo "$fnd"
done

Для поиска по другому пути, замените ~/, как вы хотите

Редактировать: Если имя папки содержит пробелы, используйте это

#!/bin/bash
  find . -type d | while read fpath; do echo $fpath; done  
0 голосов
/ 30 апреля 2018
shopt -s nullglob
for path in ~/pkg_*/
do
    [do what you want if at least one such directory exists]
    break
done

Пояснение:

  • Установка nullglob гарантирует, что ~/pkg_*/ преобразуется в пустую строку, если такой директории не существует, что означает, что мы не входим в цикл.
  • конечная косая черта гарантирует, что мы сопоставляем только каталоги, а не обычные файлы.
  • Чтобы развернуть тильду и звездочку так, как вы хотите, чтобы эти символы были без кавычек. Если в кавычках они совпадают литерал тильды и символы звездочки в именах файлов, что возможно, но очень необычно.
  • break прекращает проход по циклу, , поэтому условный запуск выполняется только один раз.

Пример сеанса:

$ cd
$ shopt -s nullglob
$ for path in ~/pkg_*/
> do
>     echo 'Found one!'
>     break
> done
$ mkdir 'pkg_a'
$ for path in ~/pkg_*/
> do
>     echo 'Found one!'
>     break
> done
Found one!
$ mkdir 'pkg_b with spaces'
$ for path in ~/pkg_*/
> do
>     echo 'Found one!'
>     break
> done
Found one!
0 голосов
/ 30 апреля 2018

Хотя это не элегантный однострочный текст, вы можете попробовать это:

filelist="$HOME/pkg_*"
for f in $filelist; do
    if [ -d "$f" ]; then
        action_if_true
    fi
done

Однако, это имеет побочный эффект от действия, выполняемого более одного раза, если у вас есть несколько совпадающих папок.

Кстати, я использовал переменную окружения $ HOME вместо тильды в первой строке, так как тильда не работает.

Я проверил это, и оно, похоже, также работает в классической оболочке Bourne.

Эксперты по bash могут найти лучший ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...