是否有一种简单的方法可以递归地查找目录层次结构中所有不以扩展名列表结尾的文件?例如,所有不是* .dll或* .exe的文件
UNIX / GNU find,尽管功能强大,但似乎没有某种exclude
模式(或者我很想念它),而且我总是发现很难使用正则表达式来查找与特定表达式不匹配的东西。
我在Windows环境中(使用大多数GNU工具的GnuWin32端口),因此同样可以使用仅限Windows的解决方案。
是否有一种简单的方法可以递归地查找目录层次结构中所有不以扩展名列表结尾的文件?例如,所有不是* .dll或* .exe的文件
UNIX / GNU find,尽管功能强大,但似乎没有某种exclude
模式(或者我很想念它),而且我总是发现很难使用正则表达式来查找与特定表达式不匹配的东西。
我在Windows环境中(使用大多数GNU工具的GnuWin32端口),因此同样可以使用仅限Windows的解决方案。
Answers:
多一个 :-)
$ 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 $
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”结尾
如果扩展名列表很长-维护较长的扩展名序列-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。
-not
可以替换为'!'
(建议使用报价)。另一方面,-name
区分大小写而不-iname
区分大小写。