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查找。