Unixで特定の拡張子で終わっていないファイル名を見つけるには?


207

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

UNIX / GNUの検索は、そのままでは強力ですが、excludeモードがないようです(またはそれが欠けているようです)。特定の表現と一致しないものを見つけるために正規表現を使用することは常に難しいと感じていました

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

回答:


343

またはそれなし(でそれを脱出する必要性:

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

6
-not置き換えることができます'!'(見積書をお勧めします)。一方、-name大文字と小文字を区別しつつある-iname場合に鈍感です。
Ivan Chau


8
$ find . -name \*.exe -o -name \*.dll -o -print

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


4

あなたはgrepコマンドを使用して何かをすることができます:

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

-v上のフラグgrep、具体的には、「物事を見つけることはありません。この表現に一致します。」


6
grep -v '\。(dll | exe)$'は、たとえば "dexe"という名前のファイルまたはディレクトリに対する照合を防止します
drAlberT '27

これは拡張正規表現でのみ機能します。これを機能させるには、-E(またはegrepを使用)を追加する必要がありました。
joctee

2

もう1つ:-)

$ ls -ltr
合計10
-rw-r--r-- 1スクリプターlinuxdumb 47 Dec 23 14:46 test1
-rw-r--r-- 1スクリプターlinuxdumb 0 1月4日23:40 test4
-rw-r--r-- 1スクリプターlinuxdumb 0 1月4日23:40 test3
-rw-r--r-- 1スクリプターlinuxdumb 0 1月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 1月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
$見つける。-type f!-name "* 1"!-name "* 2" -print
./test3
./test4
./file3
./file4
./file5
ドル

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



1

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」で終わることをシェルに伝える区切り制御文字です。


0

このページの他の解決策は、拡張機能のリストが長い場合(長いシーケンスを維持するの-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を使用してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.