Найти файлы с несколькими совпадениями шаблона в имени файла в linux [duplicate]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

202
задан thoslin 27 July 2011 в 14:15
поделиться

6 ответов

find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"

Обратите внимание, что вам нужно указать .*/ в начале, потому что find соответствует всему пути.

Пример:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

Моя версия find :

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.
248
ответ дан Susam Pal 24 August 2018 в 06:15
поделиться

Простой способ - вы можете указать. * в начале, потому что find соответствует всему пути.

$ find . -regextype egrep -regex '.*[a-f0-9\-]{36}\.jpg$'

найти версию

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)
3
ответ дан binbjz 24 August 2018 в 06:15
поделиться

Вы должны использовать абсолютный путь каталога при применении команды find с регулярным выражением. В вашем примере

find . -regex "[a-f0-9\-]\{36\}\.jpg"

следует изменить на

find . -regex "./[a-f0-9\-]\{36\}\.jpg"

. В большинстве систем Linux некоторые дисциплины в регулярном выражении не могут быть распознаны этой системой, поэтому вам нужно явно указывать -regexty как

find . -regextype posix-extended -regex "[a-f0-9\-]\{36\}\.jpg"
6
ответ дан Jens Höpken 24 August 2018 в 06:15
поделиться

Выражение find -regex соответствует всему имени, включая относительный путь из текущего каталога. Для find . это всегда начинается с ./, затем любых каталогов.

Кроме того, это emacs регулярные выражения, которые имеют другие правила экранирования, чем обычные регулярные выражения egrep.

Если все они находятся непосредственно в текущем каталоге, тогда

find . -regex '\./[a-f0-9\-]\{36\}\.jpg'

должен работать. (Я не уверен - я не могу заставить подсчитанное повторение работать здесь.) Вы можете переключиться на выражения egrep на -regextype posix-egrep:

find . -regextype posix-egrep -regex '\./[a-f0-9\-]{36}\.jpg'

(Заметим, что все сказанное здесь для GNU find, я ничего не знаю о BSD, который также является значением по умолчанию на Mac.)

58
ответ дан Paŭlo Ebermann 24 August 2018 в 06:15
поделиться

Попробуйте использовать одинарные кавычки ('), чтобы избежать экранирования вашей строки. Помните, что выражение должно соответствовать всему пути, то есть должно выглядеть так:

 find . -regex '\./[a-f0-9-]*.jpg'

Кроме того, кажется, что моя находка (GNU 4.4.2) знает только основные регулярные выражения, особенно не синтаксис {36}. Думаю, вам придется обойтись без этого.

6
ответ дан thiton 24 August 2018 в 06:15
поделиться

Судя по другим ответам, похоже, это может быть ошибкой поиска.

Однако вы можете сделать это следующим образом:

find . * | grep -P "[a-f0-9\-]{36}\.jpg"

Вы возможно, придется немного настроить grep и использовать разные параметры в зависимости от того, что вы хотите, но он работает.

25
ответ дан yarian 24 August 2018 в 06:15
поделиться
Другие вопросы по тегам:

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