Сделайте «найти -RegexType Egrep», как псевдоним

Да, это возможно, хотя способов больше, чем один.

1) Опция общей папки в менеджере виртуальных машин

В зависимости от менеджера виртуальных машин, должна быть опция общего доступа к папке с хоста (Windows в вашем случае) на виртуальную машину (Ubuntu).

Например

В VMware это находится в настройках VM -> вкладка Options -> Shared Folder. Выберите "Всегда включено", затем в разделе "Папки" нажмите кнопку "Добавить".

2) Создать сетевую файловую систему (NFS)

Это более сложный вариант, поскольку он включает в себя некоторые настройки. Сначала нужно настроить Windows на общий доступ к папке через NFS (отличная статья от Microsoft здесь).

Для справки:

Чтобы открыть общий доступ к папке с помощью Nfsshare.exe:

  1. Войдите на сервер под управлением Windows, используя учетную запись административного уровня.

  2. Нажмите Пуск, выберите Выполнить, введите cmd, а затем нажмите OK.

  3. Введите следующую команду и нажмите ENTER, чтобы открыть общий доступ к папке для клиентов NFS и разрешить анонимный доступ:

    nfsshare -o anon=yes share_name=drive:path
    
  4. Введите следующую команду, а затем нажмите ENTER, чтобы удалить общий ресурс NFS:

     nfsshare имя_ресурса /delete
    
  5. Введите: nfsshare /?, а затем нажмите ENTER, чтобы отобразить параметры, которые вы можете использовать с Nfsshare.

Чтобы открыть общий доступ к папке с помощью проводника Windows:

  1. Войдите на сервер на базе Windows, используя учетную запись административного уровня.
  2. Запустите Проводник Windows.
  3. Щелкните правой кнопкой мыши папку, к которой вы хотите предоставить общий доступ, а затем выберите Общий доступ.
  4. Перейдите на вкладку NFS Sharing, а затем нажмите Share this folder.
  5. Настройте соответствующие параметры, а затем нажмите OK.

    ПРИМЕЧАНИЕ: Microsoft рекомендует установить в сети хотя бы одну службу User Name Mapping для сопоставления имен пользователей UNIX и Windows друг с другом. Пожалуйста, просмотрите статью Kb о службе User Name Mapping ниже.

    324073 КАК: Настроить сопоставление имен пользователей

После того, как вы разобрались с этим, вы можете подключить NFS под Ubuntu следующим образом:

2. 1) Создайте пустой каталог (называемый точкой монтирования)

sudo mkdir -p /mnt/nfs

/mnt/nfs будет местом на ubuntu, из которого вы сможете получить доступ к папке, но сначала нам нужно указать Ubuntu связать эту папку с NFS, созданной на windows.

2.2) Монтируем NFS на созданный каталог

Это можно сделать, обратившись к хост-серверу (Windows), который для целей данного руководства имеет IP 192.168.1.10, как показано ниже:

sudo mount 192.168.1.10:/ /mnt/nfs

Надеюсь, это было то, что вы искали.

4
02.11.2018, 06:57
3 ответа

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

regexFind() {
    (( "$#" )) || { printf 'Insufficient arguments provided \n' >&2; return 1; }
     find "$1" -regextype egrep -iregex ".*\.(sh|md)$"
}

и вызовите функцию как

regexFind "/home/foo/bar"

Кроме того, чтобы добавить к вашим выводам, обратите внимание, что bashтакже имеет встроенный способ для glob-файлов. Вам просто нужно включить пару расширенных опций оболочки, чтобы заставить его работать. -sвключает опцию, а -uотключает ее.

nullglobпозволяет игнорировать результаты un -расширенного глобуса как действительные совпадения. Итак, если вы хотите сопоставить файлы, оканчивающиеся на *.shи *.md,вам просто нужно перейти в этот конкретный каталог и выполнить

shopt -s nullglob
fileList=(*.sh)
fileList+=(*.md)
shopt -u nullglob

и распечатайте результаты, чтобы увидеть их ниже. Не забудьте указать расширение в кавычках, чтобы имена файлов не подвергались разделению Word -.

printf '%s\n' "${fileList[@]}"
7
27.01.2020, 20:46

Обратите внимание, что регулярные выражения GNU findпо умолчанию не являются BRE, а emacs REs (своего рода гибрид между BRE и ERE, где, например, +поддерживается, но вам нужны \(...\)и |поддерживается, но как\|).

В BSD findпо умолчанию используется BRE, и вы можете использовать параметр -Eдля включения ERE, так что здесь просто:

alias efind='find -E'

или:

efind() { find -E "$@"; }

В GNU findвключение ERE осуществляется с помощью предиката -regextype posix-extended, а не параметра. Этот предикат должен стоять после имен файлов, которые, если они есть, должны стоять после опций и перед -regexили -iregex, которые их используют.

Синтаксис GNU findследующий:

find [options] [files] [predicates]
                      ^

Так что вам нужно вставить его туда (в положение, отмеченное^).

Таким образом, при определении функции-оболочки или сценария необходимо учитывать, что :пропустить все параметры и имена файлов и вставить -regextype posix-extendedсразу после них.

efind() (
  found_predicate=false
  for arg do
    "$found_predicate" || case $arg in
      (-[LPDd]|-[OD]*) ;;  # skip options
      (-*|['()!'])
        set -- "$@" -regextype posix-extended
        found_predicate=true;;
    esac
    set -- "$@" "$arg"
    shift
  done

  exec find "$@"
)

Еще пара заметок:

  • ваш первый напечатал bogus.pyне потому, что использовались BRE, а потому, что вы использовали regexвместо -regex. regexбыло принято как имя файла, а не предикат.
  • find. | egrep...недействителен, поскольку пути к файлам могут состоять из более чем одной строки. С инструментами GNU или совместимыми вы можете выполнить find. -print0 | grep -zE...для работы с записями с разделителями NUL -(и подключиться к tr '\0' '\n', если это для отображения.
4
27.01.2020, 20:46
find. -type f \( -name '*.sh' -o -name '*.md' \)

Это будет работать со всеми реализациями find, поскольку не требует поддержки сопоставления регулярных выражений.

Чтобы сделать это более гибким:

suffixfind () (
    dir=$1
    shift

    for suf do
        set -- "$@" -o -name "*.$suf"
        shift
    done
    shift

    find "$dir" -type f \( "$@" \)
)

Эта вспомогательная функция оболочки (, которая будет работать в любойsh-подобной оболочке ), выберет первый аргумент командной строки и поместит его в переменную dir. Затем он создаст список -name "*.<suf1>" -o -name "*.<suf2>" (etc.)со всеми суффиксами имен файлов в командной строке функции перед вызовом findс этим списком для поиска файлов в $dirили ниже.

Вы бы использовали его как

suffixfind /usr sh md txt

, чтобы найти все обычные файлы с именами, заканчивающимися на .sh, .mdили .txtв пути /usrили под ним.

Несколько более подробный вариант вышеприведенного с использованием bashмассивов и bashлокальных переменных:

suffixfind () {
    local dir=$1
    shift

    local names

    names=( -name "*.$1" )
    shift
    for suf do
        names+=( -o -name "*.$suf" )
    done

    find "$dir" -type f \( "${names[@]}" \)
}

О вашем упоминании инструментов GNU и переносимости :Обратите внимание, что инструменты GNU в системах, отличных от -Linux, иногда доступны, но с префиксом gк именам инструментов. Таким образом, GNU findбудет доступен как gfind, чтобы отличить его от собственной реализации findв системе.

Таким образом, ваш "переносимый GNU" подход должен был бы проверить, доступен ли gfind, прежде чем проверять, действительно ли findявляется GNU find. Только после того, как вы сделаете это (, возможно, проверив статус возврата и вывод find --version), вы не сможете быть уверены, что имеете дело с GNU find.

3
27.01.2020, 20:46

Теги

Похожие вопросы