find命令是linux非常常用的命令,这里记录下find命令查找多种类型文件的用法。
1.匹配多种类型的文件。
一般下面两种做法就够用:
1)使用-name或者-iname选项,后者忽略大小写,再用-o选项连接来搜索多种类型文件。-o表示or或的意思。
$ find ./ -name "*.mk" -o -name "*.java" -type f
./tests/src/com/android/voicedialer/VoiceDialerLaunchPerformance.java
./tests/Android.mk
./CleanSpec.mk
./src/com/android/voicedialer/VoiceContact.java
./src/com/android/voicedialer/VoiceDialerActivity.java
./src/com/android/voicedialer/RecognizerEngine.java
./src/com/android/voicedialer/VoiceDialerReceiver.java
./src/com/android/voicedialer/CommandRecognizerEngine.java
./src/com/android/voicedialer/RecognizerLogger.java
./src/com/android/voicedialer/PhoneTypeChoiceRecognizerEngine.java
./src/com/android/voicedialer/VoiceDialerTester.java
./src/com/android/voicedialer/RecognizerClient.java
./Android.mk
注意:需要将匹配内容用双引号括起来,防止未知错误,比如只搜索了当前目录的文件。
2)使用-regex或者-iregex选项,后者忽略大小写,该选项使用正则表达式匹配整个路径,与-name不同。
$ find ./ -regex ".*\.mk$\|.*\.java$" -type f
./tests/src/com/android/voicedialer/VoiceDialerLaunchPerformance.java
./tests/Android.mk
./CleanSpec.mk
./src/com/android/voicedialer/VoiceContact.java
./src/com/android/voicedialer/VoiceDialerActivity.java
./src/com/android/voicedialer/RecognizerEngine.java
./src/com/android/voicedialer/VoiceDialerReceiver.java
./src/com/android/voicedialer/CommandRecognizerEngine.java
./src/com/android/voicedialer/RecognizerLogger.java
./src/com/android/voicedialer/PhoneTypeChoiceRecognizerEngine.java
./src/com/android/voicedialer/VoiceDialerTester.java
./src/com/android/voicedialer/RecognizerClient.java
./Android.mk
注意:这里是正则表达式,一些字符比如点.的含义与-name中用到的有区别,而且是对整个路径匹配,不只是basename。
上面两个命令,实现了类似的功能,搜索列出以.mk和.java结尾的文件。
2.匹配除需要类型之外的文件
跟上面差不多,也是用-name或-regex选项,配合-not,-a等逻辑控制。-a表示and与的意思。-not可用!代替。
1)使用-name或者-iname选项
$ find ./ ! -name "*.java" -a ! -name "*.xml" -type f
./res/drawable-mdpi/ic_vd_retry.png
./res/drawable-mdpi/ic_vd_mic_on.png
./res/drawable-mdpi/ic_vd_mic_off.png
./res/drawable-mdpi/ic_vd_green_key.png
./res/drawable-mdpi/app_voicedialer.png
./res/drawable-hdpi/ic_vd_retry.png
./res/drawable-hdpi/ic_vd_mic_on.png
./res/drawable-hdpi/ic_vd_mic_off.png
./res/drawable-hdpi/ic_vd_green_key.png
./res/drawable-hdpi/app_voicedialer.png
./tests/Android.mk
./NOTICE
./CleanSpec.mk
./.git/HEAD
./.git/index
./Android.mk
./MODULE_LICENSE_APACHE2
2)使用-regex或者-iregex选项,因为posix的正则表达式不支持环视功能,所以需配合-not逻辑。
$ find ./ -not -regex ".*\(\.xml\|\.java\)$" -type f
./res/drawable-mdpi/ic_vd_retry.png
./res/drawable-mdpi/ic_vd_mic_on.png
./res/drawable-mdpi/ic_vd_mic_off.png
./res/drawable-mdpi/ic_vd_green_key.png
./res/drawable-mdpi/app_voicedialer.png
./res/drawable-hdpi/ic_vd_retry.png
./res/drawable-hdpi/ic_vd_mic_on.png
./res/drawable-hdpi/ic_vd_mic_off.png
./res/drawable-hdpi/ic_vd_green_key.png
./res/drawable-hdpi/app_voicedialer.png
./tests/Android.mk
./NOTICE
./CleanSpec.mk
./.git/HEAD
./.git/index
./Android.mk
./MODULE_LICENSE_APACHE2
上面两个都匹配.xml和.java之外的文件。