Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei -- Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei
alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei
Das geht mit find nicht. Aber mit perl. Ohne Sonderbehandlung kaputter symlinks: ==== #!/usr/bin/perl -w use strict; use File::Find; my %found; sub wanted { my @t = glob ("*"); my $jpg = grep { /\.jpg$|\.jpeg$/i; } @t; my $txt = grep { /\.txt$/i; } @t; if( $jpg > 0 && $txt == 0 ) { if( ! $found{$File::Find::dir} ) { print "$File::Find::dir\n"; $found{$File::Find::dir}++; } } } scalar @ARGV || push(@ARGV, "."); File::Find::finddepth( { no_chdir => 0, wanted => \&wanted, }, @ARGV ); ==== HTH, -dnh, auf Nachfrage obiges auch noch kommentierend ;) -- Das 42te Gebot des Usernetzes besagt: "Du sollst nicht süchtig siggen eines Süchtigen Signatur. Auf das du selber nicht siggsüchtig werdest." Wahrscheinlich wird das jetzt wieder gesiggt. [Woko° in dag°] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Hallo,
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei
alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei
Das geht mit find nicht. Aber mit perl.
Ohne Sonderbehandlung kaputter symlinks:
==== #!/usr/bin/perl -w use strict; use File::Find;
my %found;
sub wanted { my @t = glob ("*"); my $jpg = grep { /\.jpg$|\.jpeg$/i; } @t; my $txt = grep { /\.txt$/i; } @t; if( $jpg > 0 && $txt == 0 ) { if( ! $found{$File::Find::dir} ) { print "$File::Find::dir\n"; $found{$File::Find::dir}++; } } }
scalar @ARGV || push(@ARGV, "."); File::Find::finddepth( { no_chdir => 0, wanted => \&wanted, }, @ARGV ); ====
danke David. Könnte man da nicht ein find mit einem grep kombinieren um einen Überblick zu bekommen? Automatisches Löschen finde ich in diesem Fall gefährlich, da ich einen Denkfehler bei den genannten Bedingungen haben könnte. -- Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei
alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei
Das geht mit find nicht. Aber mit perl.
Ohne Sonderbehandlung kaputter symlinks:
==== #!/usr/bin/perl -w use strict; use File::Find;
my %found;
sub wanted { my @t = glob ("*");
Ggfs. sollte man hier auch .-Dateien noch beachten: my @t = glob ("* .*");
my $jpg = grep { /\.jpg$|\.jpeg$/i; } @t; my $txt = grep { /\.txt$/i; } @t; if( $jpg > 0 && $txt == 0 ) { if( ! $found{$File::Find::dir} ) { print "$File::Find::dir\n"; $found{$File::Find::dir}++; } } }
scalar @ARGV || push(@ARGV, "."); File::Find::finddepth( { no_chdir => 0, wanted => \&wanted, }, @ARGV ); ====
Hm, evtl. sollte man da noch ganz am Anfang von 'wanted' noch ein test auf Verzeichnis einbauen. Jup, geht: sub wanted { -d _ || return; my @t = glob ("*"); [..]
danke David. Könnte man da nicht ein find mit einem grep kombinieren um einen Überblick zu bekommen? Automatisches Löschen finde ich in diesem Fall gefährlich, da ich einen Denkfehler bei den genannten Bedingungen haben könnte.
Obiges gibt ja erstmal nur die Liste der Verzeichnisse aus. Und wie willst du das mit find+grep machen? Das verzwurbelt's mir das Hirn, da du erst die Verzeichnisse suchen mußt, dann gucken ob jpegs drin sind, dann in denen, die noch überbleiben gucken ob .txt drin sind ... Das gibt ein Variablen- und Quotingdesaster. Achso, getestet hab ich mit: $ tree . |-- 1 | |-- 1.jpg | `-- 11 | |-- 11.jpg | `-- 12.jpg |-- 2 | |-- 2.jpg | `-- 22 | |-- 22.jpg | `-- 22.txt |-- 3 | `-- 1.jpg -> 11.jpg |-- 4 | |-- 4.jpg | |-- 4.txt | |-- 41.JPEG | `-- 44 | |-- 41.jpg | |-- 43.jpg | `-- 44.jpg Ausgabe: $ ./findjpg.pl ./1 ./1/11 ./2 ./3 ./4/44 HTH, -dnh -- 65: Internet-Boom Schwachsinn (Theo Lieven) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo. On Friday 20 September 2013 20:47:16 Аl Воgnеr wrote:
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Hallo,
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei
alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei
Das geht mit find nicht. Aber mit perl.
Ohne Sonderbehandlung kaputter symlinks:
==== #!/usr/bin/perl -w use strict; use File::Find;
my %found;
sub wanted { my @t = glob ("*"); my $jpg = grep { /\.jpg$|\.jpeg$/i; } @t; my $txt = grep { /\.txt$/i; } @t; if( $jpg > 0 && $txt == 0 ) { if( ! $found{$File::Find::dir} ) { print "$File::Find::dir\n"; $found{$File::Find::dir}++; } } }
scalar @ARGV || push(@ARGV, "."); File::Find::finddepth( { no_chdir => 0, wanted => \&wanted, }, @ARGV ); ====
danke David. Könnte man da nicht ein find mit einem grep kombinieren um einen Überblick zu bekommen? Automatisches Löschen finde ich in diesem Fall gefährlich, da ich einen Denkfehler bei den genannten Bedingungen haben könnte.
-- Αl
Wenn dir die Perl-Loesung nicht gefaellt - fuer einen Ueberblick geht folgendes: Mit find eine Liste der Verzeichnisse erstellen und in einer Datei ablegen, die Jpegs enthalten: find . -type f -name '*jpg' -exec dirname {} \;|uniq|sort >jpg Dasselbe nochmal mit txt-Dateien: find . -type f -name '*txt' -exec dirname {} \;|uniq|sort >txt Jetzt haben wir also eine Datei, in der die Verzeichnisse aufgelistet sind, in denen Bilder liegen, und eine mit den Textdateien - natuerlich ueberschneiden sich die Listen. Das muessen wir noch rausfiltern: Vergleich der Listen mit comm: comm -2 -3 jpg txt ergibt dann saemtliche Verzeichnissse, die nur Bilder enthalten, comm -1 -3 jpg txt alle mit nur Textdateien und comm -1 -2 jpg txt alle gemischten Verzeichnisse. Auf kaputte Symlinks habe ich jetzt keine Lust ;-) Gruss, Hartwig -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Аl, Am 20.09.2013 20:47 schrieb Аl Воgnеr <suse-ml@corr.eu.org>:
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Hallo,
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei
alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei
Das geht mit find nicht. Aber mit perl.
Ohne Sonderbehandlung kaputter symlinks:
==== #!/usr/bin/perl -w use strict; use File::Find;
my %found;
sub wanted { my @t = glob ("*"); my $jpg = grep { /\.jpg$|\.jpeg$/i; } @t; my $txt = grep { /\.txt$/i; } @t; if( $jpg > 0 && $txt == 0 ) { if( ! $found{$File::Find::dir} ) { print "$File::Find::dir\n"; $found{$File::Find::dir}++; } } }
scalar @ARGV || push(@ARGV, "."); File::Find::finddepth( { no_chdir => 0, wanted => \&wanted, }, @ARGV ); ====
danke David. Könnte man da nicht ein find mit einem grep kombinieren um einen Überblick zu bekommen? Automatisches Löschen finde ich in diesem Fall gefährlich, da ich einen Denkfehler bei den genannten Bedingungen haben könnte.
Alternativ zu grep vielleicht sed: find . -type f -print | sed -e '/\.jpg/!d' Mit freundlichen Grüßen si -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Sat, 21 Sep 2013, Susan Ivanova schrieb:
Am 20.09.2013 20:47 schrieb ?l ??gn?r <suse-ml@corr.eu.org>:
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei [..] Das geht mit find nicht. Aber mit perl.
Alternativ zu grep vielleicht sed:
find . -type f -print | sed -e '/\.jpg/!d'
Äh, hallo? was soll das bringen? Es geht hier darum, die *Verzeichnisse* mit *.jpe?g Dateien zu finden die keine *.txt Datei enthalten. Nicht darum, irgendwelche *.jpg _Dateien_ zu finden. Das was du machst ist äquivalent zu: find . -type f -name '*.jpg' Naja, aber immerhin ist ein Beispiel für die exotische Syntax von sed dabei rausgekommen: ==== man sed === After the address (or address-range), and before the command, a ! may be inserted, which specifies that the command shall only be executed if the address (or address-range) does not match. ==== Weil die Bedingung (/\.jpg/!) auf alle Zeilen ausser die mit *.jpg passt wird das 'd' immer ausgeführt, es sei denn, das Muster "\.jpg" passt für diese Zeile (in dem Fall wird offenbar der ohne '-n' default Befehl 'p' um den aktuellen pattern-space auszugeben ausgeführt). Nettes Beispiel für sed. Mehr aber nicht. Aber eben komplett am Thema vorbei. Setzen, 4-, wg. kreativer Verwendung von sed und Pessimierung der Laufzeit des Befehls. -dnh, shell-Opa v.D., vermutlich[1] [1] bash + sed, awk, etc. pp, allerdings nicht zsh +, oder csh + -- Seely: Vielleicht schicken die ja nächstes Mal einen Mann für einen Männerjob ... Jordan: Was machen Sie dann hier? -- Crossing Jordan -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo David, Am 21.09.2013 12:10 schrieb David Haller <dnh@opensuse.org>:
Hallo,
Am Sat, 21 Sep 2013, Susan Ivanova schrieb:
Am 20.09.2013 20:47 schrieb ?l ??gn?r <suse-ml@corr.eu.org>:
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei [..] Das geht mit find nicht. Aber mit perl.
Alternativ zu grep vielleicht sed:
find . -type f -print | sed -e '/\.jpg/!d'
Äh, hallo? was soll das bringen?
Es geht hier darum, die *Verzeichnisse* mit *.jpe?g Dateien zu finden die keine *.txt Datei enthalten. Nicht darum, irgendwelche *.jpg _Dateien_ zu finden.
mea culpa, ich habe übersehe, dass das Kriterium der *.txt eine Ausschlussbedingung ist.
Das was du machst ist äquivalent zu:
find . -type f -name '*.jpg'
.. und das ist mir jetzt wirklich peinlich.
Naja, aber immerhin ist ein Beispiel für die exotische Syntax von sed dabei rausgekommen:
==== man sed === After the address (or address-range), and before the command, a ! may be inserted, which specifies that the command shall only be executed if the address (or address-range) does not match. ====
Danke für die Blumen!
Weil die Bedingung (/\.jpg/!) auf alle Zeilen ausser die mit *.jpg passt wird das 'd' immer ausgeführt, es sei denn, das Muster "\.jpg" passt für diese Zeile (in dem Fall wird offenbar der ohne '-n' default Befehl 'p' um den aktuellen pattern-space auszugeben ausgeführt). Nettes Beispiel für sed. Mehr aber nicht. Aber eben komplett am Thema vorbei. Setzen, 4-, wg. kreativer Verwendung von sed und Pessimierung der Laufzeit des Befehls.
Wie gut, dass ich nicht mehr in die Schule geht! Ich werde mich jedenfalls einer Bewertung jeglicher pädagogischen Rhetorik enthalten.
-dnh, shell-Opa v.D., vermutlich[1]
[1] bash + sed, awk, etc. pp, allerdings nicht zsh +, oder csh +
Mit freundlichen Grüßen si -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Am Sa, 21 Sep 2013 11:06:59 CEST schrieb Susan Ivanova:
Hallo Аl,
Am 20.09.2013 20:47 schrieb Аl Воgnеr <suse-ml@corr.eu.org>:
Am Fr, 20 Sep 2013 18:27:13 CEST schrieb David Haller:
Hallo,
Am Fri, 20 Sep 2013, ?l ??gn?r schrieb:
Wie suche ich alle Verzeichnisse, die eine *.jpg-Datei enthalten, aber _keine_ *.txt Datei
alternativ alle Verzeichnisse mit *.jpg-Datei als normale Datei oder als (kaputter) Link und _keine_ *.txt Datei
Das geht mit find nicht. Aber mit perl.
Ohne Sonderbehandlung kaputter symlinks:
==== #!/usr/bin/perl -w use strict; use File::Find;
my %found;
sub wanted { my @t = glob ("*"); my $jpg = grep { /\.jpg$|\.jpeg$/i; } @t; my $txt = grep { /\.txt$/i; } @t; if( $jpg > 0 && $txt == 0 ) { if( ! $found{$File::Find::dir} ) { print "$File::Find::dir\n"; $found{$File::Find::dir}++; } } }
scalar @ARGV || push(@ARGV, "."); File::Find::finddepth( { no_chdir => 0, wanted => \&wanted, }, @ARGV ); ====
danke David. Könnte man da nicht ein find mit einem grep kombinieren um einen Überblick zu bekommen? Automatisches Löschen finde ich in diesem Fall gefährlich, da ich einen Denkfehler bei den genannten Bedingungen haben könnte.
Alternativ zu grep vielleicht sed:
find . -type f -print | sed -e '/\.jpg/!d'
Ich antworte hier stellvertretend zu den anderen Antworten und bedanke mich dafür. Ich hätte mir nicht gedacht, dass das gar nicht so einfach ist. Ich schätze den Vorteil deutlich geringer ein diese Verzeichnisse zu finden, vielleicht 5-10 als dabei einen Fehler zu machen. Es geht nur um ein paar kb. Über die Bedingungen bin ich mir nicht ganz sicher, aber ich denke, ich könnte auch nach Verzeichnissen suchen, die genau 1 jpg-Datei mit 2 Links unter anderem Namen auf diese jpg-Datei haben. Das Löschen kann ich auch dann manuell kontrollieren und entscheiden. Jedenfalls kann ich mir Überraschungen vorstellen, dass meine Kriterien vielleicht doch nicht 100%ig sind. Ansonsten denke ich, dass man da mit der Bash und einem Script schon weiter kommt, allerdings nicht mit einem Einzeiler, zB mit dirname, wc -l, etc. Ein Script, das länger ist als ein paar Zeilen, war aber nicht meine Frage. Da fällt mir auch selber was ein. Ich hoffte auf einen find-Befehl. -- Αl -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (4)
-
David Haller
-
Hartwig Atrops
-
Susan Ivanova
-
Аl Воgnеr