- How can I use grep to show just filenames on Linux? [closed]
- Поиск в Linux с помощью команды find
- Общий синтаксис
- Описание опций
- Примеры использования find
- Поиск файла по имени
- Поиск по дате
- По типу
- Поиск по правам доступа
- Поиск файла по содержимому
- С сортировкой по дате модификации
- Лимит на количество выводимых результатов
- Поиск с действием (exec)
- Чистка по расписанию
- Как получить только имя файла с linux `find`?
- Ещё вопросы
How can I use grep to show just filenames on Linux? [closed]
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
This question does not appear to be about a specific programming problem, a software algorithm, or software tools primarily used by programmers. If you believe the question would be on-topic on another Stack Exchange site, you can leave a comment to explain where the question may be able to be answered.
How can I use grep to show just file-names (no in-line matches) on Linux? I am usually using something like:
find . -iname "*php" -exec grep -H myString <> \;
How can I just get the file-names (with paths), but without the matches? Do I have to use xargs? I didn’t see a way to do this on my grep man page.
Great question. I actually started using this to open a list of files returned by grep in Vim. vim $(grep -rl Something app/)
You cannot list files using grep command, it is basically used to fetch desired text from a file or a list. For instance, ps aux | grep ‘apt-get’ or grep ‘text-to-find’ /path/to/file/
@iamjayp Ummm, you can too list files using the grep command. grep -lr ‘text-to-find’ ./* works quite nicely!
@Peter Moderators can only migrate questions that are less than 60 days old. Therefore, for old questions that are nevertheless off-topic here because they’re not about programming, closing them is our only option. I feel strongly that such questions should not be deleted, because that is destructive of value, but reopening them also makes no sense because it sets a bad example to users who are unaware that SO limits themselves only to programming questions.
Поиск в Linux с помощью команды find
Обновлено: 01.02.2022 Опубликовано: 25.07.2016
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
— путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.». — набор правил, по которым выполнять поиск. * по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Также доступны логические операторы:
Оператор | Описание |
---|---|
-a | Логическое И. Объединяем несколько критериев поиска. |
-o | Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска. |
-not или ! | Логическое НЕ. Инвертирует критерий поиска. |
Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
find . -name «sess_*» -a -name «*cd»
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
find . -name «sess_*» -o -name «*cd»
в) Более компактный вид имеют регулярные выражения, например:
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
* данная команда найдет файлы, которые менялись более 60 дней назад.
find . -mmin -20 -mmin +10 -type f
* найти все файлы, которые менялись более 10 минут, но не более 20-и.
2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find —version).
find . -type f -newermt «2019-11-02 00:00»
* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.
find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02
* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).
find . -type f -newerat 2019-10-08
* все файлы, к которым обращались с 08.10.2019.
find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* все файлы, к которым обращались в октябре.
find . -type f -newerct 2019-09-07
* все файлы, созданные с 07 сентября 2019 года.
find . -type f -newerct 2019-09-07 ! -newerct «2019-09-09 07:50:00»
* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50
По типу
Искать в текущей директории и всех ее подпапках только файлы:
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
2. Находим файлы, доступ к которым имеет только владелец:
Поиск файла по содержимому
find / -type f -exec grep -i -H «content» <> \;
* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.
С сортировкой по дате модификации
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
find /data -type f -printf ‘%TY-%Tm-%Td %TT %p\n’ | sort -r | head -n 1
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
find . -name «sess_*» -type f -print -exec rm <> \;
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
2. Переименовать найденные файлы:
find . -name «sess_*» -type f -exec mv <> new_name \;
find . -name «sess_*» -type f | xargs -I ‘<>‘ mv <> new_name
3. Переместить найденные файлы:
find . -name «sess_*» -type f -exec mv <> /new/path/ \;
* в данном примере мы переместим все найденные файлы в каталог /new/path/.
4. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
find /home/user/* -type d -exec chmod 2700 <> \;
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
6. Передать найденные файлы конвееру (pipe):
find /etc -name ‘*.conf’ -follow -type f -exec cat <> \; | grep ‘test’
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
7. Произвести замену в файлах с помощью команды sed:
find /opt/project -type f -exec sed -i -e «s/test/production/g» <> \;
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.
Как получить только имя файла с linux `find`?
@Urchin Нет причин, по которым это не должно происходить, если у вас правильная логика (то есть -o имеет более низкий приоритет, чем подразумеваемый -a , поэтому вы часто захотите сгруппировать аргументы -o )
find ./ -name «*» -printf «%f\n» | xargs grep «searchName» Это не работает, будет только печатать: about.php: Нет такого файла или каталога. grep: site-themes.php: Нет такого файла или каталога. Или find ./ -name «*» | xargs grep «searchName» -printf «%f\n» все еще ошибка
Я не думаю, что это правильный ответ. find -printf «%f\n» -exec echo <> \; показывает, что оригинальное имя файла передается вперед
Если ваша находка не имеет опции -printf, вы также можете использовать базовое имя:
find ./dir1 -type f -exec basename <> \;
Если вы используете GNU find
Или вы можете использовать язык программирования, такой как Ruby (1.9 +)
Если вам предлагается bash (не менее 4) решение
shopt -s globstar for file in **; do echo $; done
Используйте -execdir , который автоматически удерживает текущий файл в <> , например:
find . -type f -execdir echo '<>' ';'
Вы также можете использовать $PWD вместо . (на некоторых системах он не будет создавать дополнительную точку спереди).
-execdir utility [argument . ] ;
Первичный -execdir идентичен первичному элементу -exec , за исключением того, что утилита будет выполнена из каталога, в котором хранит текущий файл.
При использовании + вместо ; , тогда <> заменяется как можно большим количеством путей для каждого вызова утилиты. Другими словами, он будет печатать все имена файлов в одной строке.
Я получаю ./filename вместо имени filename . В зависимости от ваших потребностей, это может или не может быть хорошо.
Если вы хотите выполнить какое-либо действие только с именем файла, использование basename может быть жестким.
find ~/clang+llvm-3.3/bin/ -type f -exec echo basename <> \;
будет просто отвечать на basename /my/found/path . Не то, что мы хотим, если хотим выполнить в имени файла.
Но вы можете сделать xargs вывод. например, чтобы убить файлы в каталоге, основанные на именах в другом каталоге:
cd dirIwantToRMin; find ~/clang+llvm-3.3/bin/ -type f -exec basename <> \; | xargs rm
Я нашел решение (на странице makandracards), которое дает только самое новое имя файла:
Ещё вопросы
- 1 Моя реализация обнаружения столкновений не ведет себя нормально
- 0 Окно браузера Chrome
- 0 Преобразование PHP в Python для получения смещения часового пояса
- 0 Лучший способ для двух последовательных таблиц SELECT
- 0 Асинхронный обратный вызов не был вызван в течение тайм-аута — модульное тестирование службы Typescript & Angular $ http
- 1 Как отключить быструю загрузку в новом «Android Device Manager» Xamarin?
- 1 Eclipse PDE: имитирует IResourceChangeEvents для создания IJavaProject между PDE и рабочим пространством разработчика?
- 0 Ширина CSS браузеров
- 0 Функция AngularJS ng-click не работает после содержимого информационного окна $ compile map
- 1 Как проверить Http / 2 через ohttp?
- 0 Кодировка сервера Mysql отличается от кодировки клиента (latin1 vs utf8mb4). Насколько плохо?
- 0 2 указателя даты в одном поле ввода
- 0 когда запускается SDL_MOUSEBUTTONUP?
- 0 HTML с использованием ASP
- 1 Как получить выбранный документ на viewPanel xPage для данных внешнего источника?
- 0 Какую версию Nsight можно использовать в CUDA5.5 в VisualStudio2010?
- 0 Выполнение запроса занимает много времени в AWS RDS
- 0 Функция C ++, возвращающая строку с запятой
- 0 Функция моего друга не выполняется
- 0 Проверять, что все флажки сняты?
- 0 кодирование значения объекта в функции ng-click
- 1 Как получить доступ к user_posts в Facebook Graph API
- 0 Замена липкого заголовка вторым заголовком, когда он достигает текущего застрявшего заголовка
- 0 Показать разделы на основе значения флажка в jQuery (SharePoint 2010)
- 0 сгенерированный файл MSM
- 1 Получить значение вычисляемого свойства в Vue.js и использовать его в свойстве данных
- 1 Как получить неуправляемый C-массив переменной длины в структуре из C в C #?
- 1 Есть ли способ отправить письмо из Spotfire одним нажатием кнопки?
- 0 Слияние сложных массивов
- 0 Как запретить Tomcat 7 / Spring / Tiles обрезать пробелы в выводе HTML
- 1 Razor DropDownListFor SelectList, как связать неисчислимые селекты или как это сделать?
- 1 Исключение NoClassDefFoundError
- 0 Код отслеживания не установлен (Google Analytics)
- 1 Ошибка формата даты в Java
- 1 чтение структуры каталогов и преобразование ее в объект JSON в Java
- 1 Как закрыть полноэкранную рекламу, не нажимая кнопку закрытия?
- 1 Вложено для петли в терминале
- 0 Ошибки округления, дающие неправильные тесты в DFT?
- 0 текстовый текст getSuggestions в диалоге jQuery
- 0 NodeJS асинхронный вызов MySQL к пулу соединений не возвращает результата
- 0 Присвойте значение текстовому окну gridview, используя jquery
- 0 Присоединиться по user_id в Symfony
- 1 Звук не играет ожидаемое количество раз
- 0 Выдвижной ящик плохой FPS на мобильном телефоне
- 0 Простой селектор jQuery
- 0 Детрукторы и унаследованные функции c ++
- 0 Как правильно выполнить sql в скриптах с закрытыми классами
- 1 Я не понимаю, как я получаю этот вывод (в цепочке операторов)
- 0 HTML-форма Codeigniter — нельзя нажимать на поля ввода
- 0 Экспресс-проверка Paypal не отображается должным образом в Firefox