Linux find files not named

find filenames NOT ending in specific extensions on Unix?

Is there a simple way to recursively find all files in a directory hierarchy, that do not end in a list of extensions? E.g. all files that are not *.dll or *.exe UNIX/GNU find, powerful as it is, doesn’t seem to have an exclude mode (or I’m missing it), and I’ve always found it hard to use regular expressions to find things that don’t match a particular expression. I’m in a Windows environment (using the GnuWin32 port of most GNU tools), so I’m equally open for Windows-only solutions.

9 Answers 9

Or without ( and the need to escape it:

find . -not -name "*.exe" -not -name "*.dll" 

and to also exclude the listing of directories

find . -not -name "*.exe" -not -name "*.dll" -not -type d 
find . -not -name "*.exe" -not -name "*.dll" -type f 

-not can be replaced by ‘!’ (Quote is recommended). On the other hand, -name is case sensitive while -iname is case insensitive.

find . ! \( -name "*.exe" -o -name "*.dll" \) 
$ find . -name \*.exe -o -name \*.dll -o -print 

The first two -name options have no -print option, so they skipped. Everything else is printed.

You could do something using the grep command:

The -v flag on grep specifically means «find things that don’t match this expression.»

find /data1/batch/source/export -type f -not -name "*.dll" -not -name "*.exe" 

Starting from the current directory, recursively find all files ending in .dll or .exe

find . -type f | grep -P "\.dll$|\.exe$" 

Starting from the current directory, recursively find all files that DON’T end in .dll or .exe

find . -type f | grep -vP "\.dll$|\.exe$" 

(1) The P option in grep indicates that we are using the Perl style to write our regular expressions to be used in conjunction with the grep command. For the purpose of excecuting the grep command in conjunction with regular expressions, I find that the Perl style is the most powerful style around.

Читайте также:  Свой сервер майнкрафт линукс

(2) The v option in grep instructs the shell to exclude any file that satisfies the regular expression

(3) The $ character at the end of say «.dll$» is a delimiter control character that tells the shell that the filename string ends with «.dll»

$ ls -ltr total 10 -rw-r--r-- 1 scripter linuxdumb 47 Dec 23 14:46 test1 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:40 test4 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:40 test3 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:40 test2 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:41 file5 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:41 file4 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:41 file3 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:41 file2 -rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:41 file1 $ find . -type f ! -name "*1" ! -name "*2" -print ./test3 ./test4 ./file3 ./file4 ./file5 $

Other solutions on this page aren’t desirable if you have a long list of extensions — maintaining a long sequence of -not -name ‘this’ -not -name ‘that’ -not -name ‘other’ would be tedious and error-prone — or if the search is programmatic and the list of extensions is built at runtime.

For those situations, a solution that more clearly separates data (the list of extensions) and code (the parameters to find ) may be desirable. Given a directory & file structure that looks like this:

. └── a ├── 1.txt ├── 15.xml ├── 8.dll ├── b │ ├── 16.xml │ ├── 2.txt │ ├── 9.dll │ └── c │ ├── 10.dll │ ├── 17.xml │ └── 3.txt ├── d │ ├── 11.dll │ ├── 18.xml │ ├── 4.txt │ └── e │ ├── 12.dll │ ├── 19.xml │ └── 5.txt └── f ├── 13.dll ├── 20.xml ├── 6.txt └── g ├── 14.dll ├── 21.xml └── 7.txt 

You can do something like this:

## data section, list undesired extensions here declare -a _BADEXT=(xml dll) ## code section, this never changes BADEXT="$( IFS="|" ; echo "$" | sed 's/|/\\|/g' )" find . -type f ! -regex ".*\.\($BADEXT\)" 
./a/1.txt ./a/b/2.txt ./a/b/c/3.txt ./a/d/4.txt ./a/d/e/5.txt ./a/f/6.txt ./a/f/g/7.txt 

You can change the extensions list without changing the code block.

NOTE doesn’t work with native OSX find — use gnu find instead.

Источник

Команда find Linux

Изображение баннера

find это мощный инструмент для работы с файлами.

С его помощью можно задавать различные составные условия для дальнейших действий над файлами.

Часто ипользуется как первый шаг перед копированием, перемещением, удалением, изменением файлов, соответсвующих определённым условиям.

В этой статье вы можете познакомится с основами применения find. Про применение find совместно с grep , sed , xargs и другими утилитами вы можете прочитать в статье «Продвинутые методы работы с find»

Читайте также:  Logging level in linux

Поиск

Найти и вывести на экран все файлы в директории

find
find .
find . -print

-name: Поиск по имени

Найти по полному имени в текущей директории

find . -name heihei.log

find . -iname heihei.log

Поиск по расширению

Найти по расширению файла с помощью wildcard *

Ищем в /usr/share/doc все pdf файлы

find /usr/share/doc -name *.pdf

-not: обратное условие

Найти в текущей директории все файлы кроме php

find . -not -name *.php
find . ! -name *.php

Несколько условий вместе

Найти все файлы, которые начинаются с log но не имеют расширения .txt

find . -name «log*» ! -name *.txt

-o: Логическое или

Найти либо .html либо .php файлы

find . -name *.html -o -name *.php

Найти и скопировать

Найти и сразу скопировать в текущую директорию

find /usr/share/doc -name *.pdf -exec cp <> . \;

Найти в текущей директории

Удалить из текущей директории

find -name *.pdf -delete

Поиск по типу

Чтобы найти только файлы определённого типа выполните find с опцией type.

Например, что найти все ссылки в директории /etc

Подробнее о файлах в Linux читайте в статье «Типы файлов в Linux»

Уровни вложенности

Найти все ссылки только на верхнем уровне вложенности

find /etc -maxdepth 1 -type l

Поиск по размеру файла

Filesystem Size Used Avail Use% Mounted on /dev/sda1 1014M 194M 821M 20% /boot

Найти обычные файлы определённого размера

Чтобы найти обычные файлы нужно использовать -type f

find /boot -size +20000k -type f

find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img /boot/initramfs-3.10.0-1160.el7.x86_64.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img

Файлы бывают следующих типов:

— : regular file
d : directory
c : character device file
b : block device file
s : local socket file
p : named pipe
l : symbolic link

find /boot -size +10000k -type f

find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img /boot/initramfs-3.10.0-1160.el7.x86_64.img /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img

То же самое плюс показать размер файлов

find /boot -size +10000k -type f -exec du -h <> \;

find: ‘/boot/efi/EFI/centos’: Permission denied find: ‘/boot/grub2’: Permission denied 60M /boot/initramfs-0-rescue-389ee10be1b38d4281b9720fabd80a37.img 21M /boot/initramfs-3.10.0-1160.el7.x86_64.img 13M /boot/initramfs-3.10.0-1160.el7.x86_64kdump.img 21M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64.img 14M /boot/initramfs-3.10.0-1160.2.2.el7.x86_64kdump.img

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

Обратите внимание, что в find, в отличие от grep , ставить перед началом названия никаких символов не нужно.

find -name topb*

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

Найти в проекте topbicyle все директории с qa в названии

find topbicycle/ -name *qa* -type d

Читайте также:  Linux echo экранирование символов

-perm: поиск по правам доступа

find . -type f -perm 0600
find . -type f ! -perm 0600

-path: поиск путей

Если мне нужно посмотреть содержимое директорий /code/php и /code/python

Пример укороченного результата

-prune: ограничить глубину

С помощью path можно посмотреть содержимое всех поддиректорий code на букву p /code/p*

Если нужно посмотреть только поддиректории верхнего уровня — используется -prune

find . -path «./code/p*» -prune

Получили только поддиректории без их содержимого

Исключить директорию из поиска

Из предыдущего параграфа понятно, что с помощью prune можно исключить директорию из поиска.

Пример: найти в ./code все файлы, заканчивающиеся на index.php но проигнорировать поддиректории на p, то есть в директориях python и php не искать.

find ./code -path «./code/p*» -prune -false -o -name «*index.php»

./code/js/errors/index.php ./code/js/index.php ./code/c/index.php ./code/cpp/index.php ./code/go/pointers/index.php ./code/go/declare_variable/index.php ./code/go/constants/index.php ./code/go/index.php ./code/java/index.php ./code/dotnet/index.php ./code/ruby/index.php ./code/theory/index.php ./code/index.php

-false нужен чтобы не выводить проигнорированные директории.

Ещё один способ исключить директорию из поиска

find ./code -name «*.php« -not -path «./code/p*»

Источник

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.

Источник

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