是否有一种简单的方法来递归地找到目录层次结构中的所有文件,而不是以扩展名列表结束?例如,所有不是*.dll或*.exe的文件
UNIX/GNU find虽然功能强大,但似乎没有排除模式(或者我错过了它),而且我总是发现很难使用正则表达式来查找与特定表达式不匹配的内容。
我在Windows环境中(使用大多数GNU工具的GnuWin32端口),所以我同样对Windows专用解决方案持开放态度。
是否有一种简单的方法来递归地找到目录层次结构中的所有文件,而不是以扩展名列表结束?例如,所有不是*.dll或*.exe的文件
UNIX/GNU find虽然功能强大,但似乎没有排除模式(或者我错过了它),而且我总是发现很难使用正则表达式来查找与特定表达式不匹配的内容。
我在Windows环境中(使用大多数GNU工具的GnuWin32端口),所以我同样对Windows专用解决方案持开放态度。
当前回答
还有一个:-)
$ 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 $
Unix查找命令参考
其他回答
$ find . -name \*.exe -o -name \*.dll -o -print
前两个name选项没有-print选项,所以跳过了。其他的都打印出来了。
find . ! \( -name "*.exe" -o -name "*.dll" \)
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样式是最强大的样式。
grep中的v选项指示shell排除任何满足正则表达式的文件
(3)在".dll$"结尾的$字符是一个分隔符控制字符,它告诉shell文件名字符串以".dll"结尾。
与-regex一起使用-not
find . -type f -not -regex '.*\.\(exe\|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 $
Unix查找命令参考