ubuntuusers.de

rekursiv Dateien suchen u. Ergebnis in Datei exportieren

Status: Ungelöst | Ubuntu-Version: Ubuntu
Antworten |

technohead

Avatar von technohead

Anmeldungsdatum:
1. April 2007

Beiträge: 869

möchte ganz gerne ein Unterverzeichnis rekursiv nach MP3-Dateien durchsuchen, und das Ergebnis in einer Datei speichern. Mein Problem ist, dass ich auch die ID3-Tags mit auslesen muss. (soll als Grundlage für eine Datenbank dienen)

Im Ergebnis sollten die Zeilen in der Datei dann in etwa so aussehen

Path;Künstler;Titel;Album;Genre

(getrennt durch Semikolon)

ist so etwas möglich?

vielen Dank schon mal

u.li

Avatar von u.li

Anmeldungsdatum:
12. Mai 2007

Beiträge: 503

Wohnort: Hürth

Ein schnell zusammengeschustertes Perl Skript:

#!/usr/bin/perl -w

use strict;

if( defined( $ARGV[0] ) )
{
	rekurs( $ARGV[0] );
}
else
{
	rekurs( '.' );
}

exit 0;

###

sub rekurs
{
	my ($dir) = @_;

	foreach my $file (`ls -1 "$dir"`)
	{
		chomp( $file );
		
		if( $file =~ /\.mp3$/i )
		{
			mp3info( "$dir/$file" );
		}

		if( -d "$dir/$file" )
		{
			rekurs( "$dir/$file" );
		}
	}
}

sub mp3info
{
	my ($file) = @_;
	my $data;

	$data = `mp3info -p "%F;%a;%t;%l;%g" "$file"`;

	print "$data\n";
}


Du brauchst das Programm mp3info dafür.

Es schreibt in die Standardausgabe, also wäre der Aufruf etwa:

./mp3db.pl /wo/die/musik/ist >/wo/die/db/hin/soll/mp3s.db

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

Warum so kompliziert?

find -name "*.mp3"|while read file; do mp3info -p "%F;%a;%t;%l;%g\n" "$file"; done


tuts auch

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

Da brauch man kein perl, nur find und mp3info:

find /wo/die/Musik/ist/ -name "*.mp3" -type f -exec mp3info -p "%F;%a;%t;%l;%g" {} \; >/wo/die/db/hin/soll/mp3s.db 2>/dev/null


Den mp3info Format String hab ich gnadenlos dem u-li geklaut 😉

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Also Rekursiv durch Dateien durchgehen geht ziemlich schnell mit find.

find /home/sidburn/ -iname '*.mp3'

@u.li
Also für ne Perl Lösung ist das schlecht...
Wofür gibt es File::Find

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;

find( \&wanted, @ARGV );
sub wanted {
    print $File::Find::name  if  m/\.mp3$/i;
}

In eine Datei Speichern z.B. find.pl. Und dann durch aufruf von

find.pl <directory> ...

Findet er auch alle .mp3 Dateien rekursiv aus allen Ordnern die in der Argumentenliste angegeben werden.

in der wanted Subroutine kann mann dann auch dann seine mp3info Subroutine aufrufen.

Oder noch besser, gleich ein Perl Modul nehmen das das für einen macht z.B.: MP3::Tag

NoKurth

Avatar von NoKurth

Anmeldungsdatum:
18. August 2006

Beiträge: 430

Hallo,

*ich auch noch, ich auch noch* 😉

Bei mir schreibt mp3info die Daten in eine Zeile, macht also nicht je Datei einen Zeilenumbruch. Deshalb schlage ich diese Lösung vor:

find "$(pwd)" -type f -name "*\.mp3" -exec mp3info "{}" -p "%F;%a;%t;%l;%g-+-" \; | sed 's/-+-/\n/g' > ZielDatei

Gruß
Norman

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden

NoKurth hat geschrieben:

Hallo,

*ich auch noch, ich auch noch* 😉

Bei mir schreibt mp3info die Daten in eine Zeile, macht also nicht je Datei einen Zeilenumbruch. Deshalb schlage ich diese Lösung vor:

find "$(pwd)" -type f -name "*\.mp3" -exec mp3info "{}" -p "%F;%a;%t;%l;%g-+-" \; | sed 's/-+-/\n/g' > ZielDatei

Gruß
Norman

Warum dann nicht gleich ein \n an das Ende des mp3info Formatstring?

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

Hört mir hier überhaupt jemand zu? *heul* 😛 😉
Pumbaa80 hat geschrieben:

Warum so kompliziert?

find -name "*.mp3"|while read file; do mp3info -p "%F;%a;%t;%l;%g\n" "$file"; done


tuts auch

Aber zugegeben: die Methode mit "-exec" ist natürlich eleganter als die Pipe... ☺

comm_a_nder

Avatar von comm_a_nder

Anmeldungsdatum:
5. Februar 2006

Beiträge: 2533

Wohnort: Dresden


Wir kommen vor lauter um die Wette schreiben nicht dazu den Rest zu lesen.

PS: Und ich bleib bei meiner Meinung, Perlprogrammierer ziehen sich die Hose mit der Kneifzange an ☺

NoKurth

Avatar von NoKurth

Anmeldungsdatum:
18. August 2006

Beiträge: 430

Hallo,
comm@nder hat geschrieben:

Warum dann nicht gleich ein \n an das Ende des mp3info Formatstring?

Oder so.
Kann es sein, dass bei mir alle Ausgaben in einer Zeile landen, weil ich kein Genre in meinen MP3s abgelegt habe? Oder ist das Verhalten von mp3info ohne Zeilenumbruch "normal"?

Pumbaa80 hat geschrieben:

Hört mir hier überhaupt jemand zu? *heul* 😛 😉

Anscheinend nicht! 😉

Gruß
Norman

Pumbaa80 Team-Icon

Avatar von Pumbaa80

Anmeldungsdatum:
5. März 2007

Beiträge: 2130

Wohnort: Residenz des Rechts

ihr seid gemein...

Oder ist das Verhalten von mp3info ohne Zeilenumbruch "normal"?

ja.

u.li

Avatar von u.li

Anmeldungsdatum:
12. Mai 2007

Beiträge: 503

Wohnort: Hürth

😢 $ego->destroy();

Ok, meine anfängliche Lösung war kagge, habe ich noch einen Versuch?
Das Problem mit mp3info ist, dass es nur ID3v1 unterstützt, daher hier mein zweiter Versuch mit den genannten Verbesserungen:

#!/usr/bin/perl -w

use warnings;
use strict;
use File::Find;
use MP3::Info;

find( \&mp3info, @ARGV );

sub mp3info {
	if( /\.mp3$/i ) {
		my $tag = get_mp3tag($_) or warn "*** No ID3 Tag: $_\n" and return;
		print "$File::Find::name;$tag->{ARTIST};$tag->{TITLE};$tag->{ALBUM};$tag->{GENRE}\n";
	}
} 

technohead

(Themenstarter)
Avatar von technohead

Anmeldungsdatum:
1. April 2007

Beiträge: 869

Herzlichen Dank für das gigantische Feedback 😀

sma

Anmeldungsdatum:
30. November 2008

Beiträge: 121

Nun gebe ich zu diesem alten Thread auch noch meinen Senf dazu. Ich stand vor dem gleichen Problem wie der Threadstarter und konnte mir Dank der Tipps in diesem Thread folgenden Befehl basteln:

find "$(pwd)" -type f -name "*\.mp3" -exec mp3info "{}" -r m -p "%r kbps\tMPEG %.1v\tLayer %L\tFrequenz %Q\tCorrupt Frames %b\tLänge %m:%02s\t%f\t%k KB\t%a\t%t\t%n\t%l\t%y\n" \; | sort > ~/mp3info_log.ods

Dieser Befehl sucht sich im aktuellen als auch in allen Unterverzeichnissen (also rekursiv) alle mp3-Dateien zusammen und liest aus ihnen

1) technische Infos (zB Bitrate, MPEG Layer, Dateigröße, Länge, Frequenz, Corrupt Frames, Dateiname etc.) und

2) Tag-Infos (Artist, Trackname, Album, Track-Nummer, Jahr)

aus und speichert das ganze in der Datei mp3info_log.ods im Homeverzeichnis. Ein Doppelklick auf diese Datei öffnet OOo Calc (Spaltentrenner Tabulatoren). Durch Sortieren der entsprechenden Spalte kann man schnell Dateien mit ungenügender Bitrate, Frequenz oder fehlenden Tag-Infos finden.

Eine Alternative zu dem oben zitierten Befehl ist:

find '/Pfad/' -name "*.mp3" -type f -exec mp3info -r m -p "%r kbps\tMPEG %.1v\tLayer %L\tFrequenz %Q\tCorrupt Frames %b\tLänge %m:%02s\t%f\t%k KB\t%a\t%t\t%n\t%l\t%y\n" {} \; | sort > ~/mp3info_log.ods 2>/dev/null

Der Ausdruck /Pfad/ muss durch den Pfad in dem sich die mp3-Dateien befinden ersetzt werden. Dann kann man den Befehl von jedem Verzeichnis aus starten.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

@sma: Die Dateiendung .ods ist allerdings ein bisschen irreführend. Das ist normalerweise die Endung für das Format von OpenOffice-Calc. Das enthält die Datei ja aber gar nicht. Da wäre eher .csv passend. Das steht zwar eigentlich für comma separated values, aber die Endung hat sich auch für Dateien durchgesetzt, bei denen die Werte durch Tabulatoren oder Semikolons statt durch Kommas getrennt sind.

Antworten |