ディレクトリ階層内のすべてのファイルを再帰的に見つける簡単な方法はありますか?not拡張子のリストで終わりますか?例えば。 * .dllまたは* .exeではないすべてのファイル
UNIX/GNU findは、それでも強力ですが、exclude
モードを持たないようです(または、私はそれを見逃しています)。そして、do n'tは特定の表現に一致しません。
私は(ほとんどのGNU_ツールの GnuWin32 ポートを使用して)Windows環境にいるので、Windowsのみのソリューションに対しても同様にオープンです。
または、(
とそれをエスケープする必要なし:
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
find . ! \( -name "*.exe" -o -name "*.dll" \)
$ find . -name \*.exe -o -name \*.dll -o -print
最初の2つの-nameオプションには-printオプションがないため、スキップされました。それ以外はすべて印刷されます。
Grepコマンドを使用して何かを行うことができます。
find . | grep -v '(dll|exe)$'
grep
の-v
フラグは、具体的には「do n'tがこの式に一致するものを見つける」ことを意味します。
もう一つ:-)
$ 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 $
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」で終わることをシェルに伝える区切り文字制御文字です。
find /data1/batch/source/export -type f -not -name "*.dll" -not -name "*.exe"
拡張機能の長いリストがある場合(-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を使用してください。