У меня есть файлы коллекции из многих систем на моем предприятии в каталоге магазина (/ store /), и я хотел найти все файлы passwd и объединить их в один файл. Интуитивно я придумал и использовал следующую команду:
find /store/ -name passwd -type f -exec cat {} + > all_passwds.txt
Но это также собирает файл / etc / passwd, который является двоичными файлами (я предполагаю, что некоторые системы символизируют ссылку на busybox или что-то в этом роде). Мне просто нужны текстовые файлы passwd.
Моя следующая мысль заключается в том, что, возможно, я смогу найти все файлы / etc / passwd и вытащить совпадения с регулярными выражениями. Я пару часов пытался создать регулярное выражение, которое будет соответствовать формату passwd.
Мы будем очень благодарны за любую помощь по созданию регулярного выражения, которое будет соответствовать файлам / etc / passwd, или по обеспечению того, чтобы приведенная выше команда захватывала только текстовые файлы passwd.
Если вы хотите использовать регулярное выражение, тогда ^([^:]*:){6}[^:]*$
вероятно, достаточно, чтобы сопоставить семь полей, разделенных :
в каждой строке, чтобы вы могли:
find /store -name passwd -type f -exec grep -hIE '^([^:]*:){6}[^:]*$' {} + > all_passwds.txt
-h
опустите имена файлов в выводе-I
пропустить двоичные файлы-E
включить расширенные регулярные выражения (ERE)Во-первых: двоичные файлы, скорее всего, bin/passwd
- т.е. инструмент смены пароля ...
Простое решение, которое может сработать, если все, что вам нужно passwd
файлы находятся в подкаталогах, называемых etc
:
find /store/ -wholename '*/etc/passwd'
Это только найдет etc/passwd
файлы, которые должен быть правильного формата.
Если это не сработает, создайте цикл с file
утилита и объединить, только если это текстовый файл:
file /etc/passwd
/etc/passwd: ASCII text
Наконец, я выбрал следующее регулярное выражение из старого фрагмента кода PHP. При необходимости адаптируйте:
\w+:\w+:\d+:\d+:[\w\d\s,@()]*:[\w\d\s\/]*:[\d\s\w\/]*