Знайдіть файли за довжиною імені файлу


10

Я хочу знайти всі файли за довжиною імен файлів.

Наприклад , якщо я хочу знайти файли довжиною 1, наприклад a.go, b.go.

Я кладу:

grep '.\{1\}' file

Але це не працює. Яку команду можна використовувати для пошуку файлів за довжиною імені файлу?


a.go- це ім'я файлу довжиною 4. a- це ім'я файлу довжиною 1. Це Unix, а не DOS, де ім'я та розширення були окремими та неявна .завжди була частиною імені файлу.
Пітер Кордес

Відповіді:


3

grepшукає шаблони у вмісті файлів. Якщо ви хочете подивитися назви файлів, ви можете просто скористатися глобулом оболонки (якщо ви хочете враховувати лише файли файлів у поточному каталозі):

echo ?.go

(До речі, глобус оцінює саме оболонку, а не echoкоманду.)

Якщо ви хочете шукати каталоги рекурсивно, починаючи з поточного каталогу, інструмент, який слід використовувати find:

find . -name '?.go'

(Зверніть увагу, що ви повинні процитувати шаблон, щоб запобігти оцінці оболонки як глобус, перш ніж ви отримаєте find.)


1
Тут також знайдуться каталоги, які також відповідають шаблону '? .Go'.
slm

@slm, каталоги - це один із багатьох типів файлів, в ОП не вказано, який тип файлів він був після.
Стефан Шазелас

8

Якщо ви просто хочете знайти імена файлів, ви можете використовувати таку команду:

find -exec basename '{}' ';' | egrep '^.{100,}$'

Це запуститься find, витягнувши ім'я файлу чи каталогу за допомогою basenameта перегляньте будь-яке ім’я файлу чи теки, що має принаймні 100 символів. Якщо ви хочете знайти ім'я файлу точної довжини, використовуйте {100}замість {100,}.

Якщо ви хочете знайти імена файлів, включаючи шлях, зробіть це:

find | egrep '/[^/]{100,}$'

Це поверне ім'я файлу, включаючи відносний шлях до того, де ви запустили команду find.


3

Перш за все, здійснює 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 Compatible Regular Expressions , які необхідні для {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}\.[^.]+$'

ПРИМІТКА. У наведеному вище рішенні передбачається, що у вас є відносно розумні назви файлів, які не містять нових символів рядків і т.д. Якщо будь-яка з цих проблем є проблемою, дайте мені знати, і я оновлю свою відповідь.


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

На MacOS X використовуйте egrep та видаліть опцію -P
Bart Kummel

@BartKummel - фактично для OSX я використовую ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Також усвідомлюйте, що цей Q не позначений як OSX, тому використання grepє влучним.
slm

1

Я б використав щось подібне.

find . -type f -name "?.go"

Тож якщо ви покладете два "?" то ви шукаєте імена файлів з двома символами та розширенням.


0

Коли ви хочете використовувати регулярну експресію в команді find, ви повинні використовувати ""такі:

find /var/log -iname "*.err" 

для використання у вашому випадку:

find yourpath -type f -a -name "?.go"

Ви повинні замінити реальний шлях на ваш шлях, -aце And -type fозначає, що ви шукаєте лише звичайні файли.

? у вашому запиті означає один характер, наприклад DOS, якщо ви пам'ятаєте.


-1

ls ?.* має дати бажані результати.


Ласкаво просимо до Unix.SE. На жаль, не корисно додавати відповіді на старі запитання, на які вже є багато хороших відповідей. (Якщо немає нового кращого способу вирішення старої проблеми, або у вас є краще рішення, ніж будь-яка з старих відповідей.) Якщо ви хочете відповісти на деякі запитання, подивіться на нові питання на першій сторінці.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.