a.goэто имя файла длины 4. aэто имя файла длины 1. Это Unix, а не DOS, где имя и расширение были отдельными и неявное .всегда было частью имени файла.
Питер Кордес
Ответы:
3
grepищет шаблоны в содержимом файлов. Если вы хотите посмотреть на имена файлов, вы можете просто использовать глобус оболочки (если вы хотите учитывать только имена файлов в текущем каталоге):
echo ?.go
(Кстати, это оболочка, которая оценивает глоб, а не echoкоманда.)
Если вы хотите просматривать каталоги рекурсивно, начиная с текущего каталога, используйте инструмент find:
find . -name '?.go'
(Обратите внимание, что вы должны заключить шаблон в кавычки, чтобы оболочка не оценивала его как глобус, прежде чем findего вызовут.)
Также будут найдены каталоги, которые также соответствуют шаблону «? .Go».
SLM
@slm, каталоги - это один из многих типов файлов, ОП не указал, какой тип файлов ему нужен.
Стефан Шазелас
8
Если вы просто хотите найти имена файлов, вы можете использовать следующую команду:
find -exec basename '{}' ';' | egrep '^.{100,}$'
Это запустится find, вытягивая имя файла или каталога, используя, basenameа затем ищите любое имя файла или имя каталога, которое содержит не менее 100 символов. Если вы хотите найти имя файла точной длины, используйте {100}вместо {100,}.
Если вы хотите найти имена файлов, включая путь, сделайте это:
find | egrep '/[^/]{100,}$'
Это вернет имя файла, включая относительный путь, по которому вы запустили команду поиска.
Прежде всего, grepпоиск по содержимому файлов, он не будет искать имена файлов. За что ты хочешь find. У него нет возможности установить длину имени файла, но вы можете проанализировать его вывод, чтобы получить то, что вы хотите. Вот несколько примеров, которые я запускаю в каталоге, содержащем следующие файлы:
$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
├── a
├── ab
├── abc
└── abcd
Итак, чтобы найти файлы длиной X, нам нужно удалить путь и сопоставить только символы после последнего /:
$ find . -type f | grep -P '/.{3}$'
Команда sedпросто удаляет ./. Этот -Pфлаг активирует Perl-совместимые регулярные выражения, для {n}которых требуется PCRE, а $значит «соответствует концу строки».
Вы также можете просто сделать это:
find . -type f | grep -P '/...$'
Это хорошо для небольших чисел, набирающих 15 точек, чтобы соответствовать именам файлов длиной 15, не очень эффективно.
Наконец, если вы хотите игнорировать расширение и сопоставлять только имя файла, сделайте это (как предложено @slm):
find . -type f | grep -P '/.{1}\.'
Тем не менее, это также найдет файлы, как a.bo.go. Это лучше, если ваши имена файлов могут содержать более одного .:
find . -type f | grep -P '/.{1}\.[^.]+$'
ПРИМЕЧАНИЕ. Приведенное выше решение предполагает, что у вас есть относительно нормальные имена файлов, которые не содержат символов новой строки и т. Д. Он также будет учитывать не игнорировать пробелы в именах файлов при расчете длины, которая может не соответствовать вашей. Если что-то из этого является проблемой, дайте мне знать, и я обновлю свой ответ.
добро пожаловать в Unix.SE. К сожалению, бесполезно добавлять ответы на старые вопросы, на которые уже есть много хороших ответов. (Если нет нового лучшего способа решения старой проблемы или у вас нет лучшего решения, чем любой из старых ответов.) Если вы хотите ответить на некоторые вопросы, посмотрите новые вопросы на первой странице.
a.go
это имя файла длины 4.a
это имя файла длины 1. Это Unix, а не DOS, где имя и расширение были отдельными и неявное.
всегда было частью имени файла.Ответы:
grep
ищет шаблоны в содержимом файлов. Если вы хотите посмотреть на имена файлов, вы можете просто использовать глобус оболочки (если вы хотите учитывать только имена файлов в текущем каталоге):(Кстати, это оболочка, которая оценивает глоб, а не
echo
команда.)Если вы хотите просматривать каталоги рекурсивно, начиная с текущего каталога, используйте инструмент
find
:(Обратите внимание, что вы должны заключить шаблон в кавычки, чтобы оболочка не оценивала его как глобус, прежде чем
find
его вызовут.)источник
Если вы просто хотите найти имена файлов, вы можете использовать следующую команду:
Это запустится
find
, вытягивая имя файла или каталога, используя,basename
а затем ищите любое имя файла или имя каталога, которое содержит не менее 100 символов. Если вы хотите найти имя файла точной длины, используйте{100}
вместо{100,}
.Если вы хотите найти имена файлов, включая путь, сделайте это:
Это вернет имя файла, включая относительный путь, по которому вы запустили команду поиска.
источник
Прежде всего,
grep
поиск по содержимому файлов, он не будет искать имена файлов. За что ты хочешьfind
. У него нет возможности установить длину имени файла, но вы можете проанализировать его вывод, чтобы получить то, что вы хотите. Вот несколько примеров, которые я запускаю в каталоге, содержащем следующие файлы:Поиск файлов в этом каталоге возвращает:
Итак, чтобы найти файлы длиной X, нам нужно удалить путь и сопоставить только символы после последнего
/
:Команда
sed
просто удаляет./
. Этот-P
флаг активирует Perl-совместимые регулярные выражения, для{n}
которых требуется PCRE, а$
значит «соответствует концу строки».Вы также можете просто сделать это:
Это хорошо для небольших чисел, набирающих 15 точек, чтобы соответствовать именам файлов длиной 15, не очень эффективно.
Наконец, если вы хотите игнорировать расширение и сопоставлять только имя файла, сделайте это (как предложено @slm):
Тем не менее, это также найдет файлы, как
a.bo.go
. Это лучше, если ваши имена файлов могут содержать более одного.
:ПРИМЕЧАНИЕ. Приведенное выше решение предполагает, что у вас есть относительно нормальные имена файлов, которые не содержат символов новой строки и т. Д. Он также будет учитывать не игнорировать пробелы в именах файлов при расчете длины, которая может не соответствовать вашей. Если что-то из этого является проблемой, дайте мне знать, и я обновлю свой ответ.
источник
Вы не указываете, но если файлы находятся в структуре каталогов, вы можете использовать,
find
чтобы найти файлы длиной 1, с помощьюgrep
:пример
источник
ggrep
: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Также поймите, что этот Q не был помечен как OSX, так что использованиеgrep
является подходящим.Я бы использовал что-то вроде этого.
Так что, если вы поставите два "?" Затем вы ищете имена файлов с двумя символами и расширением.
источник
Если вы хотите использовать регулярные выражения в команде find, вы должны использовать
""
такие как:для вашего случая использования:
Вы должны заменить свой реальный путь на ваш путь,
-a
чтоAnd
-type f
означает, что вы ищете только обычные файлы.?
в вашем запросе имеется в виду один символ, такой как DOS, если вы помните.источник
ls ?.*
должен дать вам желаемые результаты.источник