web-dev-qa-db-ja.com

特定の拡張子で終わらないファイル名を見つけるためのUNIX find?

ディレクトリ階層内のすべてのファイルを再帰的に見つける簡単な方法はありますか?not拡張子のリストで終わりますか?例えば。 * .dllまたは* .exeではないすべてのファイル

UNIX/GNU findは、それでも強力ですが、excludeモードを持たないようです(または、私はそれを見逃しています)。そして、do n'tは特定の表現に一致しません。

私は(ほとんどのGNU_ツールの GnuWin32 ポートを使用して)Windows環境にいるので、Windowsのみのソリューションに対しても同様にオープンです。

185

または、(とそれをエスケープする必要なし:

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

最初の2つの-nameオプションには-printオプションがないため、スキップされました。それ以外はすべて印刷されます。

8
Jeff Ferland

Grepコマンドを使用して何かを行うことができます。

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

grep-vフラグは、具体的には「do n'tがこの式に一致するものを見つける」ことを意味します。

4
VoteyDisciple

もう一つ:-)

$ ls -ltr 
 total 10 
-rw-r--r-- 1スクリプター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スクリプトlinuxdumb 0 Jan 4 23:41 file5 
-rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23:41 file4 
-rw-r--r-- 1スクリプト作成者linuxdumb 0 Jan 4 23:41 file3 
-rw-r--r-- 1 scripter linuxdumb 0 Jan 4 23 :41 file2 
-rw-r--r-- 1スクリプトlinuxdumb 0 Jan 4 23:41 file1 
 $ find。 -タイプf! -name "* 1"! -name "* 2" -print 
 ./ test3 
 ./ test4 
 ./ file3 
 ./ file4 
 ./ file5 
 $ 
 

nix findコマンドリファレンス

2
logic

Linux/OS X:

現在のディレクトリから開始し、.dllまたは.exeで終わるすべてのファイルを再帰的に検索します

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

現在のディレクトリから開始して、.dllまたは.exeで終了しないすべてのファイルを再帰的に検索します

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

ノート:

(1)grepのPオプションは、grepコマンドと組み合わせて使用​​する正規表現を記述するためにPerlスタイルを使用していることを示しています。 grepコマンドを正規表現と組み合わせて実行するために、Perlスタイルが最も強力なスタイルであることがわかりました。

(2)grepのvオプションは、正規表現を満たすファイルを除外するようシェルに指示します

(3)「.dll $」の末尾の$文字は、ファイル名文字列が「.dll」で終わることをシェルに伝える区切り文字制御文字です。

1
Vietnhi Phuvan
find  /data1/batch/source/export   -type f -not  -name "*.dll" -not -name "*.exe"
1
gwecho huang

拡張機能の長いリストがある場合(-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

コードブロックを変更せずに拡張機能リストを変更できます。

NOTEはネイティブOSX findでは機能しません-代わりにgnu findを使用してください。

0
Chris Johnson