UlfZibis
Anmeldungsdatum: 13. Juli 2011
Beiträge: 3021
Wohnort: Köln
|
Hallo, folgender Befehl soll mir alle JPG- und MOV-Dateien auflisten: find . -mindepth 1 -iname "*.JPG" -or -iname "*.MOV" -ls Merkwürdigerweise listet er aber nur die MOV-Dateien auf. Lasse ich -or -iname "*.MOV" weg, listet er mir die JPG-Dateien auf. Komisch, früher hat der Befehl immer so funktioniert. Hat die aktuelle Version evtl. einen Bug? $ find --version
find (GNU findutils) 4.7.0-git
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Aktivierte Eigenschaften: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13892
|
UlfZibis schrieb: folgender Befehl soll mir alle JPG- und MOV-Dateien auflisten: find . -mindepth 1 -iname "*.JPG" -or -iname "*.MOV" -ls Merkwürdigerweise listet er aber nur die MOV-Dateien auf. Lasse ich -or -iname "*.MOV" weg, listet er mir die JPG-Dateien auf. Komisch, früher hat der Befehl immer so funktioniert. Hat die aktuelle Version evtl. einen Bug?
Was macht hier find wenn Du statt "-or" das "-and" verwendest?
|
UlfZibis
(Themenstarter)
Anmeldungsdatum: 13. Juli 2011
Beiträge: 3021
Wohnort: Köln
|
lubux schrieb: Was macht hier find wenn Du statt "-or" das "-and" verwendest?
Dann kommt nix, so wie es auch sein müsste. Schön, dass Du antwortest, ich befürchtete schon, für bekloppt gehalten zu werden, das uralte find könne einen so simplen Bug enthalten. Meine eigentliche Absicht ist: find . -mindepth 1 -iname "*.JPG" -or -iname "*.MOV" -exec ln {} \; um um sämtliche Bilder und Videos in den Unterordnern in das aktuelle Verzeichnis zu verlinken, was mit dem Befehl vor 2..3 Monaten noch tadellos funktionierte. Um ein Problem mit -exec ln {} \; auszuschließen, habe ich dann zum Test mal -ls genommen.
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1139
Wohnort: Schäl Sick
|
UlfZibis schrieb: Schön, dass Du antwortest, ich befürchtete schon, für bekloppt gehalten zu werden, das uralte find könne einen so simplen Bug enthalten.
Sieht so aus, als wurde in der Shell-Version, die unter 18.04 läuft, einiges geändert. Durchaus möglich, dass die auch find angefasst haben.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13892
|
UlfZibis schrieb: ..., was mit dem Befehl vor 2..3 Monaten noch tadellos funktionierte. Um ein Problem mit -exec ln {} \; auszuschließen, habe ich dann zum Test mal -ls genommen.
Ja, denn ohne '-ls' funktioniert es ja. Aber mit einem 14.04 (find (GNU findutils) 4.4.2) funktioniert es so, d. h. mit '-ls' auch nicht.
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1139
Wohnort: Schäl Sick
|
Gerade ausprobiert:
find . -mindepth 1 -iname "*.JPG" -ls -or -iname "*.MOV" -ls | fgrep -i mov zeigt auch beide Dateitypen an. Edit: natürlich ohne das
| fgrep -i mov am Ende (ich hatte vergessen, das im Anschluss wieder herauszunehmen). Getestet habe ich aber auch ohne.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13892
|
wxpte schrieb: Gerade ausprobiert:
find . -mindepth 1 -iname "*.JPG" -ls -or -iname "*.MOV" -ls | fgrep -i mov zeigt auch beide Dateitypen an.
Ja, '-ls' wird 2mal benötigt.
|
fleet_street
Top-Wikiautor
Anmeldungsdatum: 30. August 2016
Beiträge: 2127
Wohnort: Hunsrück
|
Wie wär's mit Klammern? (find (Abschnitt „Kombinationen“))
find . -mindepth 1 \( -iname "*.JPG" -or -iname "*.MOV" \) -ls (Okay, nicht schön, aber das soll ja auch der Fehler sein, warum in der Physik nichts mehr vorangeht. 😉 😈 )
|
UlfZibis
(Themenstarter)
Anmeldungsdatum: 13. Juli 2011
Beiträge: 3021
Wohnort: Köln
|
lubux schrieb: Ja, '-ls' wird 2mal benötigt.
Interessant! ... und danke für's Testen. Jetzt komme ich ins Grübeln, ob mein Befehl jemals voll funktioniert hat, oder da gerade keine *.JPG -Dateien zu verlinken waren. 👿 Aber wie würde es mit dem -exec ln {} \; gehen? Das 2-mal reinzusetzen fände ich ziemlich blöd. Kann man die beiden -or -Argumente irgendwie klammern.
|
UlfZibis
(Themenstarter)
Anmeldungsdatum: 13. Juli 2011
Beiträge: 3021
Wohnort: Köln
|
fleet_street schrieb: Wie wär's mit Klammern? (find (Abschnitt „Kombinationen“))
Danke, geht: find . -mindepth 1 \( -iname "*.JPG" -or -iname "*.MOV" \) -exec ln {} \;
|
frostschutz
Anmeldungsdatum: 18. November 2010
Beiträge: 7651
|
Mit der Debugoption -D kannst du ein wenig in find hineinschauen... | $ find -D tree . -mindepth 1 -iname "*.JPG" -or -iname "*.MOV" -ls
[...]
Optimized command line:
( -mindepth 1 [1] -a [0.8] -iname *.JPG [0.8] ) -or [1] ( -iname *.MOV [0.8] -a [0.8] [call stat] [need type] -ls [1] )
|
Da wird also der -or Parameter nicht gemäß deiner Intention verstanden: mindepth gilt nur für *.JPG und nicht für *.MOV, -ls dafür nur für *.MOV. | $ find -D tree . -mindepth 1 '(' -iname "*.JPG" -or -iname "*.MOV" ')' -ls
[...]
Optimized command line:
( -mindepth 1 [1] -a [1] ( -iname *.MOV [0.8] -o [1] -iname *.JPG [0.8] ) ) -a [1] [call stat] [need type] -ls [1]
|
Das sieht komisch aus, mit der extra Klammer für mindepth 1, stimmt aber so.
|