ubuntuusers.de

fehlerhafte Datei-Endungen auffinden

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

sonja

Avatar von sonja

Anmeldungsdatum:
17. Dezember 2004

Beiträge: 224

Hallo ich möchte im Terminal Dateien finden (auflisten), die eine fehlerhafte Datei-Endungen haben.

Zur Verdeutlichung habe ich ein Ordner mit 4 Dateien und ein Unterordner mit weiteren 4 Dateien.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
├── dir1
│   ├── sample
│   └── sample.
│   └── sample.c
│   └── sample.txt
│   ├── dir2
│      ├── sample1
│      └── sample1.
│      └── sample1.c
│      └── sample1.txt

so weit komme ich, die Datei ohne Endung wird gefunden, aber die nur mit dem Punkt endet, wird nicht gefunden. die 4 Beispieldateien sample.c sample.txt sample1.c sample1.txt werden nicht aufgelistet, was korrekt ist.

1
2
3
$ find . -type f -regex '.*/[^ .]*'
./dir2/sample1
./sample

Frage: wie muss ich die Syntax von find ergänzen?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17593

Wohnort: Berlin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
t530:~/tmp/massen 🐧> tree c
c
├── a
├── a.
├── a.c
└── a.txt

0 directories, 4 files
t530:~/tmp/massen 🐧> find c -type f -not -regex ".*\.[^.]+"
c/a.
c/a

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

1
find -type f -name '*.'

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1214

 find . -type f -regex '.*/[^ .]*' 

Fast richtig. Eventuell besser so:

$ find . -type f -regex '.*/[^ .]*[.]*'
./dir1/sample
./dir1/dir2/sample1.
./dir1/dir2/sample1
./dir1/sample.
$ tree
.
└── dir1
    ├── dir2
    │   ├── sample1
    │   ├── sample1.
    │   ├── sample1.c
    │   └── sample1.txt
    ├── sample
    ├── sample.
    ├── sample.c
    └── sample.txt

2 directories, 8 files
$ 

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9525

Wohnort: Münster

sonja schrieb:

[…] ich möchte im Terminal Dateien finden (auflisten), die eine fehlerhafte Datei-Endungen haben.

So etwas gibt es unter Linux nicht, was daran liegt, dass unter Linux gar keine windows-typische Endungen für Dateinamen gibt.

Du meinst vermutlich:

  • Alle Dateinamen, die keinen Punkt enthalten oder vor oder nach dem Punkt eine leere Zeichenkette enthalten.

Solche kann man mit regulären Ausdrücken suchen, da aber in diesen der Punkt ein Sonderzeichen ist, verwendet man für Deine Aufgabe besser Shell-Globs:

find . -type f ! -name '*?.?*' 

Der Donnerkeil bewirkt eine Negation der folgenden Bedingung. Du suchst ja alle gemäß Deinem Kriterium ungültigen Dateinamen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17593

Wohnort: Berlin

kB schrieb:

sonja schrieb:

[…] ich möchte im Terminal Dateien finden (auflisten), die eine fehlerhafte Datei-Endungen haben.

So etwas gibt es unter Linux nicht, was daran liegt, dass unter Linux gar keine windows-typische Endungen für Dateinamen gibt.

Im Prinzip richtig, aber je nach Kontext eben doch vielleicht falsch.

Typische Endungen sind auch nicht Windowstypisch. Es gibt .c und .h Files und zwar auch bei Linux. Sie erfüllen - abgesehen von den Endungen .exe, .bat und .com auch die gleiche Rolle.

Und viele Programme unter Linux werten auch die Dateiendung aus, etwa Geany, wenn es anhand der Endung bestimmt, welches Syntaxhighlightning zu verwenden ist.

Umgekehrt kann man wahrscheinlich auch unter Windows mit so manchem Grafikprogramm eine .png, .bmp oder .jpg-Datei öffnen, selbst wenn die Dateiendung in die Irre führt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

Verstehe ich das richtig, dass Du folgende Dateien finden willst:

  1. Kein Punkt im Namen

  2. Punkt am Ende ohne andere folgende Zeichen

?

Dann geht einer von diesen:

1
2
find -type f \( -name '*.' -o \! -name '*.*' \)
find -type f -regex '.*/\([^/]*\.\|[^./]*\)'

Erläuterung des Regex, der gegen den gesamten Pfad matched - also implizit am Anfang und Ende geankert ist:

  1. Beliebige Zeichen am Anfang des Pfades

  2. "/"

  3. Alternative

    1. Nicht-"/" gefolgt von einem "."

    2. Sequenz von Zeichen, die weder "/" noch "." sind

sonja

(Themenstarter)
Avatar von sonja

Anmeldungsdatum:
17. Dezember 2004

Beiträge: 224

Hallo, erst mal vielen Dank! 😀

Kurz noch zur Erklärung. Das sind nur Beispiel-Dateien. ... und die *.txt & *.c sind nur zum Test dabei, diese sollen ja nicht aufgelistet werden.

Hintergrund: Beim Entpacken von sehr großen Backup-Archiven sind einige wenige Dateien in tief verschachtelten Unterverzeichnissen nicht wieder richtig benannt worden. Im Schnitt Eine von 10.000. Diese soll das "find" identivizieren. Die Dateien sind sonst ok, aber die Endung ist weg.

  • @kb > funktioniert

  • @shiro > funktioniert

  • @rklm > funktioniert (zweiter Post)

Antworten |