Linux find not regex

Linux find command: How to find files not matching a pattern

Unix/Linux find command “patterns” FAQ: How do I find files or directories that don’t match a specific pattern (files not matching a regex pattern, or filename pattern)?

In my case I just ran into a situation where I needed to find all files below the current subdirectory that are NOT named with the filename pattern *.html . Fortunately with the newer Unix/Linux find syntax this solution is pretty easy, you just include the -not argument, like this:

find . -type f -not -name "*.html"

That’s it. This Linux find command using the “not” operator creates a list of all files not ending with the .html file extension (filename pattern).

Also, if you’re not familiar with it, the -f argument in that find command means “just look for files,” and don’t return search results for directories.

Find files not matching a filename pattern and doing something with them

Of course it’s usually not enough to find files not matching a filename pattern; usually you want to do something with them. Here’s how to run a simple Unix ls command on them:

find . -type f -not -name "*.html" -exec ls -l <> \;

Summary: How to find files that don’t match a filename pattern

I hope this quick tip on finding Unix and Linux files and directories that don’t match a filename pattern (not matching a pattern) has been helpful. For more information on the Linux find command, here’s a link to my Linux ‘find’ command examples article.

Источник

Поиск в Linux с помощью команды find

Обновлено

Обновлено: 01.02.2022 Опубликовано: 25.07.2016

Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.

Общий синтаксис

путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.». набор правил, по которым выполнять поиск. * по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.

Описание опций

Также доступны логические операторы:

Оператор Описание
-a Логическое И. Объединяем несколько критериев поиска.
-o Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска.
-not или ! Логическое НЕ. Инвертирует критерий поиска.

Полный набор актуальных опций можно получить командой man find.

Примеры использования find

Поиск файла по имени

* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.

2. Поиск файла по части имени:

Читайте также:  Linux features on windows

* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .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 <> \;

Читайте также:  Vlc linux install debian

* в данном примере мы ищем все каталоги (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 системах он может располагаться в разных местах.

Источник

Why does find -regex not accept my regex?

In my opinion this have to be xxxx-05xxx-xxxxx-INA.txt in the case above. Using some tool like RegexTester, everything works perfect. Using the bash command find -regex doesn´t seem to work for me. My question is, why? I can’t figure it out, I am using:

find /some/path -regex ".*[\w]-05(?!aid)[\w]-[\w]-INA\.txt" -exec echo <> \; 
$ uname -a Linux debmu838 2.6.5-7.321-smp #1 SMP Mon Nov 9 14:29:56 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux 

Not all regex engines are created equal. Syntaxes and features change. I’m not sure that find supports java regex syntax (which is what you’re testing with). It probably doesn’t.

There are quite some regular expression syntaxes supported by find (via the -regextype argument, but none of them supports (negative) lookahead assertions. So using perl or some other external RE engine as a pipe seems like in jm666’s answer seems to be the best idea.

6 Answers 6

I pretty much ditto the other answers: Find’s -regex switch can’t emulate everything in Perl’s regex, However, here’s something you can try.

Take a look at the find2perl command. That program can take a typical find statement, and give you a Perl program equivalent for it. I don’t believe -regex is recognized by find2perl (It’s not in the standard Unix find, but only in the GNU find), but you can simply use -name , and then see the program it generates. From there, you can modify the program to use the Perl expressions you want in your regex. In the end, you’ll get a small Perl script that will do the file directory find you want.

Otherwise, try using -regextype posix-extended which pretty much match most of Perl’s regex expressions. You can’t use look arounds, but you can probably find something that does work.

Читайте также:  Which hosting linux or windows

Источник

Find Files not an regex whitelist

I have a huge Folder with thousands of Files. Some Files have some Characters in it, which are not allowed. (UTF-8 signs) So I have a white list of allowed characters and a beginning of a bash-script to get a list of files with the path to it, which have some characters not on that white list.

#!/bin/bash regex="^[a-zA-Z0-9._- ]+$" while IFS= read -r -d $'\0'; do filename=`echo "$REPLY" | rev | cut -d/ -f1| rev` filepath=`echo "$REPLY" | rev | cut -d/ -f2- | rev` if ! [[ "$filename" =~ "$regex" ]] then echo "$filepath $filename" fi done < <(find /path/to/folder -type f -print0) 
find /path/to/folder -type f -regextype posix-extended ! -iregex "\/([A-Z0-9\-\_\.\ \/]*)" 
/symlnks/data/DATEN_EINGANG/DATENLIEFERUNG/Aestetico_19-11-2015/Probenbox_Probenkästen.pdf /symlnks/data/DATEN_EINGANG/DATENLIEFERUNG/Aestetico_19-11-2015/Probenbox_final.pdf /symlnks/data/DATEN_EINGANG/DATENLIEFERUNG/Aestetico_19-11-2015/._Probenbox_final.pdf 

2 Answers 2

A possible solution is. to use grep with perl-regex. The flag for this is -P

For example it should look like this:

#!/bin/bash regex="[^-_0-9A-Za-z\. ]+" while IFS= read -r -d $'\0'; do filepath=$ filename=$ #use grep with perl-regex -P and #-q for quiet to prevent output to stdin echo "$filename" | grep -qP "$regex" #now we compare the return code from grep if [[ "$?" -eq 0 ]] then echo "match: $filename" else echo "nomatch: $filename" fi done < <(find /symlnks -type f -print0) 

If you're looking to distinguish ascii from utf, the command file is probably you're best bet. man file for details.

Here's a way to find all the files in the current directory whose names are in ascii or non-ascii:

$ cat foo.sh #!/bin/bash echo "$1" > /tmp/name.txt file /tmp/name.txt | grep -q $2 exit $? $ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh <> UTF \; -a -print ./へ.txt ./robenbox_Probenkästen.txt $ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh <> ASCII \; -a -print ./foo.txt ./log.txt ./utf8.txt 
$ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh <> ASCII \; -a -print ./ascii.txt $ find . -maxdepth 1 -type f -name \*txt -exec ./foo.sh <> utf \; -a -print ./utf8.txt $ cat foo.sh #!/bin/bash file $1 | grep -q $2 exit $? 
$ cat ascii.txt English is a West Germanic language that was first spoken in early medieval England and is now a global lingua franca. $ cat utf8.txt Texts written with Man'yōgana use two different kanji for each of the syllables now pronounced き ki, ひ hi, み mi, け ke, へ he, め me, こ ko, そ so, と to, の no, も mo, よ yo and ろ ro. $ file ascii.txt ascii.txt: ASCII text $ file utf8.txt utf8.txt: UTF-8 Unicode text ken@ken-x230: ~$ od -c utf8.txt 0000000 T e x t s w r i t t e n w i 0000020 t h M a n ' y 305 215 g a n a u 0000040 s e t w o d i f f e r e n t 0000060 k a n j i f o r e a c h 0000100 o f t h e s y l l a b l e s 0000120 n o w p r o n o u n c e d 0000140 343 201 215 k i , 343 201 262 h i , 0000160 343 201 277 m i , 343 201 221 k e , 0000200 343 201 270 h e , 343 202 201 m e , 0000220 343 201 223 k o , 343 201 235 s o , 0000240 343 201 250 t o , 343 201 256 n o , 0000260 343 202 202 m o , 343 202 210 y o a 0000300 n d 343 202 215 r o . \n 0000313 ken@ken-x230: ~$ od -c ascii.txt 0000000 E n g l i s h i s a W e s 0000020 t G e r m a n i c l a n g u 0000040 a g e t h a t w a s f i r 0000060 s t s p o k e n i n e a r 0000100 l y m e d i e v a l E n g l 0000120 a n d a n d i s n o w a 0000140 g l o b a l l i n g u a f 0000160 r a n c a . \n 0000167 

Источник

Оцените статью
Adblock
detector