查找在Unix上没有以特定扩展名结尾的文件名?


207

是否有一种简单的方法可以递归地查找目录层次结构中所有以扩展名列表结尾的文件?例如,所有不是* .dll或* .exe的文件

UNIX / GNU find,尽管功能强大,但似乎没有某种exclude模式(或者我很想念它),而且我总是发现很难使用正则表达式来查找与特定表达式匹配的东西。

我在Windows环境中(使用大多数GNU工具的GnuWin32端口),因此同样可以使用仅限Windows的解决方案。

Answers:


343

还是没有(,需要逃脱它:

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

并排除目录列表

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

或以肯定的逻辑;-)

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

6
-not可以替换为'!'(建议使用报价)。另一方面,-name区分大小写而不-iname区分大小写。
Ivan Chau

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

2
在Solaris -not上,这是一个不好的选择,它的!工作效果很好:)
DmitrySandalov

8
$ find . -name \*.exe -o -name \*.dll -o -print

前两个-name选项没有-print选项,因此它们被跳过了。其他所有内容均已打印。


4

您可以使用grep命令执行以下操作:

find . | grep -v '(dll|exe)$'

-vgrep专门指“找到的东西,不要这个表达式匹配。”


6
grep -v'\。((dll | exe)$)将阻止与名为“ dexe”的文件或目录进行匹配
drAlberT

这仅适用于扩展的正则表达式。我必须添加-E(或使用egrep)来完成这项工作。
joctee

2

多一个 :-)

$ ls -ltr
总共10
-rw-r--r-- 1个脚本编辑器linuxdumb 47 Dec 23 14:46 test1
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:40 test4
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:40 test3
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:40 test2
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:41 file5
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:41 file4
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:41 file3
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:41 file2
-rw-r--r-- 1个脚本编辑器linuxdumb 0 Jan 4 23:41 file1
$查找。型f!-名称“ * 1”!-名称“ * 2”-打印
./test3
./test4
./file3
./file4
./文件5
$

Unix find命令参考


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

1

Linux / OS X:

从当前目录开始,递归查找所有以.dll或.exe结尾的文件

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

从当前目录开始,递归查找所有不以.dll或.exe结尾的文件

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

笔记:

(1)grep中的P选项表明我们正在使用Perl样式来编写正则表达式,以便与grep命令一起使用。为了与正则表达式一起执行grep命令,我发现Perl样式是最强大的样式。

(2)grep中的v选项指示外壳排除任何满足正则表达式的文件

(3)说“ .dll $”末尾的$字符是定界符控制字符,它告诉外壳程序文件名字符串以“ .dll”结尾


0

如果扩展名列表很长-维护较长的扩展名序列-not -name 'this' -not -name 'that' -not -name 'other'会很乏味且容易出错-或者搜索是程序化的并且扩展名列表是在运行时生成的,则不需要此页面上的其他解决方案。

对于那些情况,可能需要一种更清晰地将数据(扩展名列表)和代码(的参数find)分开的解决方案。给定一个目录和文件结构,如下所示:

.
└── 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

您可以执行以下操作:

## data section, list undesired extensions here
declare -a _BADEXT=(xml dll)

## code section, this never changes
BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | 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

您可以更改扩展列表,而无需更改代码块。

注意不适用于本机OSX-请find改用gnu find。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.