UNIXfind文件名不是以特定的扩展名结尾?

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

UNIX / GNU查找,function强大,似乎没有exclude模式(或者我错过了它),而且我总是发现很难使用正则expression式来查找与特定内容匹配的东西expression。

我在Windows环境下(使用大多数GNU工具的GnuWin32端口),所以我也同样开放了Windows的解决scheme。

或者没有(需要逃避它:

 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 
 find . ! \( -name "*.exe" -o -name "*.dll" \) 
 $ find . -name \*.exe -o -name \*.dll -o -print 

前两个名称选项没有打印选项,所以他们跳过。 其他一切都打印出来。

你可以用grep命令做一些事情:

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

grep上的-v标志特指“find与这个expression式匹配的东西”。

多一个 :-)

  $ 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 scripter linuxdumb 0一月4 23:41 file5
 -rw-r  -  r-- 1脚本linuxdumb 0 Jan 4 23:41 file4
 -rw-r  -  r  -  1 scripter linuxdumb 0一月4 23:41 file3
 -rw-r  -  r  -  1 scripter linuxdumb 0一月4 23:41 file2
 -rw-r  -  r-- 1脚本linuxdumb 0 Jan 4 23:41 file1
 $ find。 型f! 名“* 1”!  -name“* 2”-print
 ./test3
 ./test4
 ./file3
 ./file4
 ./file5
 $

Unixfind命令参考

Linux / OS X:

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

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

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

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

笔记:

(1)grep上的P选项表示我们正在使用Perl风格来编写我们的正则expression式,与grep命令一起使用。 为了和正则expression式一起执行grep命令,我发现Perl风格是最强大的风格。

(2)grep上的v选项指示shell排除任何满足正则expression式的文件

(3)说“.dell $”结尾处的$字符是一个分隔符控制字符,告诉shell文件名string以“.dll”结尾

如果你有一个很长的扩展名列表,在这个页面上的其他解决scheme是不可取的 – 保持一个很长的序列-not -name 'this' -not -name 'that' -not -name 'other'将是单调乏味的-prone – 或者如果search是编程式的,并且扩展名列表是在运行时build立的。

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

 . └── 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查找。