Я хочу найти все файлы по длине имен файлов.
Например , если я хочу найти файлы длиной 1, например a.go
, b.go
.
Я кладу:
grep '.\{1\}' file
Но это не работает. Какую команду можно использовать для поиска файлов по длине имени файла?
Я хочу найти все файлы по длине имен файлов.
Например , если я хочу найти файлы длиной 1, например a.go
, b.go
.
Я кладу:
grep '.\{1\}' file
Но это не работает. Какую команду можно использовать для поиска файлов по длине имени файла?
Ответы:
grep
ищет шаблоны в содержимом файлов. Если вы хотите посмотреть на имена файлов, вы можете просто использовать глобус оболочки (если вы хотите учитывать только имена файлов в текущем каталоге):
echo ?.go
(Кстати, это оболочка, которая оценивает глоб, а не echo
команда.)
Если вы хотите просматривать каталоги рекурсивно, начиная с текущего каталога, используйте инструмент find
:
find . -name '?.go'
(Обратите внимание, что вы должны заключить шаблон в кавычки, чтобы оболочка не оценивала его как глобус, прежде чем find
его вызовут.)
Если вы просто хотите найти имена файлов, вы можете использовать следующую команду:
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
Поиск файлов в этом каталоге возвращает:
$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/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}\.[^.]+$'
ПРИМЕЧАНИЕ. Приведенное выше решение предполагает, что у вас есть относительно нормальные имена файлов, которые не содержат символов новой строки и т. Д. Он также будет учитывать не игнорировать пробелы в именах файлов при расчете длины, которая может не соответствовать вашей. Если что-то из этого является проблемой, дайте мне знать, и я обновлю свой ответ.
Вы не указываете, но если файлы находятся в структуре каталогов, вы можете использовать, find
чтобы найти файлы длиной 1, с помощью grep
:
$ find . -type f | grep -P '/.{1}\.'
$ find . -type f | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c
ggrep
: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Также поймите, что этот Q не был помечен как OSX, так что использование grep
является подходящим.
Я бы использовал что-то вроде этого.
find . -type f -name "?.go"
Так что, если вы поставите два "?" Затем вы ищете имена файлов с двумя символами и расширением.
Если вы хотите использовать регулярные выражения в команде find, вы должны использовать ""
такие как:
find /var/log -iname "*.err"
для вашего случая использования:
find yourpath -type f -a -name "?.go"
Вы должны заменить свой реальный путь на ваш путь, -a
что And
-type f
означает, что вы ищете только обычные файлы.
?
в вашем запросе имеется в виду один символ, такой как DOS, если вы помните.
ls ?.*
должен дать вам желаемые результаты.
a.go
это имя файла длины 4.a
это имя файла длины 1. Это Unix, а не DOS, где имя и расширение были отдельными и неявное.
всегда было частью имени файла.