it-swarm.com.de

Dateinamen finden, die NICHT mit bestimmten Erweiterungen unter Unix enden?

Gibt es eine einfache Möglichkeit, alle Dateien in einer Verzeichnishierarchie rekursiv zu finden, die nicht mit einer Liste von Erweiterungen enden ? Z.B. Alle Dateien, die nicht * .dll oder * .exe sind

UNIX/GNU find, so mächtig es auch ist, scheint keinen exclude -Modus zu haben (oder ich vermisse ihn), und ich fand es immer schwierig, reguläre Ausdrücke zu verwenden, um Dinge zu finden, die stimmen nicht mit einem bestimmten Ausdruck überein .

Ich arbeite in einer Windows-Umgebung (benutze den GnuWin32 Port der meisten GNU Tools)), daher bin ich auch offen für reine Windows-Lösungen.

188

Oder ohne ( und die Notwendigkeit, es zu entkommen:

find . -not -name "*.exe" -not -name "*.dll"

und auch die Auflistung von Verzeichnissen auszuschließen

find . -not -name "*.exe" -not -name "*.dll" -not -type d

oder in positiver Logik ;-)

find . -not -name "*.exe" -not -name "*.dll" -type f
314
Hardy
find . ! \( -name "*.exe" -o -name "*.dll" \)
43
Chen Levy
$ find . -name \*.exe -o -name \*.dll -o -print

Die ersten beiden Optionen für -name haben keine Option -print, sodass sie übersprungen werden. Alles andere wird gedruckt.

8
Jeff Ferland

Sie könnten etwas mit dem Befehl grep tun:

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

Das -v Flag auf grep bedeutet speziell "Finde Dinge, die nicht mit diesem Ausdruck übereinstimmen."

4
VoteyDisciple

einer noch :-)

$ 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 datei4 
 - rw-r - r-- 1 scripter linuxdumb 0 Jan 4 23:41 datei3 
 - 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. -Typ f! -name "* 1"! -name "* 2" -print 
 ./ test3 
 ./ test4 
 ./ file3 
 ./ file4 
 ./ file5 
 $ 
 

nix find Befehlsreferenz

2
logic

Linux/OS X:

Suchen Sie ab dem aktuellen Verzeichnis rekursiv nach allen Dateien, die auf .dll oder .exe enden

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

Suchen Sie ab dem aktuellen Verzeichnis rekursiv nach allen Dateien, die NICHT mit .dll oder .exe enden

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

Anmerkungen:

(1) Die Option P in grep gibt an, dass wir den Perl-Stil verwenden, um unsere regulären Ausdrücke zu schreiben, die in Verbindung mit dem Befehl grep verwendet werden sollen. Um den Befehl grep in Verbindung mit regulären Ausdrücken auszuführen, stelle ich fest, dass der Perl-Stil der mächtigste Stil ist.

(2) Die Option v in grep weist die Shell an, alle Dateien auszuschließen, die den regulären Ausdruck erfüllen

(3) Das $ -Zeichen am Ende von say ".dll $" ist ein Begrenzungszeichen, das der Shell mitteilt, dass die Dateinamenzeichenfolge mit ".dll" endet.

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

Andere Lösungen auf dieser Seite sind nicht wünschenswert, wenn Sie eine lange Liste von Erweiterungen haben - eine lange Folge von -not -name 'this' -not -name 'that' -not -name 'other' wäre mühsam und fehleranfällig - oder wenn die Suche programmatisch ist und die Liste der Erweiterungen zur Laufzeit erstellt wird.

In solchen Situationen kann eine Lösung wünschenswert sein, die Daten (die Liste der Erweiterungen) und Code (die Parameter für find) klarer voneinander trennt. Angesichts einer Verzeichnis- und Dateistruktur, die so aussieht:

.
└── 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

Sie können so etwas tun:

## 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\)"

Was in ... endet:

./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

Sie können die Erweiterungsliste ändern, ohne den Codeblock zu ändern.

NOTE funktioniert nicht mit nativem OSX find - benutze stattdessen gnu find.

0
Chris Johnson