PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mp3 Dateiverwaltung auf der shell



BeatRider
27.11.06, 21:13
Hi,

ich möchte gerne skriptgesteuert ein paar mp3s verwalten.
Vielleicht kann mir jemand mit guten Shell Kenntnissen bei folgenden Problemen weiterhelfen:

1) Ich möchte gerne alle leeren Verzeichnisse löschen.
2) Ich möchte gerne alle Dateien eines Verzeichnisses, das <n> MB groß ist, in ein weiteres Verzeichnis verschieben

Probleme habe ich vor allem mit den Leerzeichen, die bei den Verzeichnissen vorhanden sein können....

Danke und Gruß aus Mannheim

marce
27.11.06, 21:37
das Leerzeichen-Problem umgehst Du, wenn Du Variablen quotest - also z.B. rmdir "$Verzeichnis" - geht auch, wenn $Verzeichnis Leerzeichen enthält...

Für den Rest: Poste doch mal deine Ansätze - daran können wir dann weiterbasteln.

Besser wärst Du damit allerdings wohl mrunix aufgehoben - Shellprogrammierung und so wird dort abgewurschtelt...

BeatRider
21.12.06, 20:59
Hi,

ok - ich habe den kompletten Ansatz leider nicht mehr, aber was mir jetzt mal spontan so einfällt ist:


#!/bin/bash
for i in `du -sh * | sort -g`; do
echo "$i";
done


das ERgebnis sieht mit " auch nicht beser aus :rolleyes:

kreol
21.12.06, 21:12
1. Leere Verzeichnisse löscht man am besten mit "rmdir". Wenn es nicht leer ist, wird der Befehl nicht ausgeführt. Also reicht schon ein "rmdir * 2>/dev/null". Achte auf die Pfadangaben (relativ/absolut) bzw. in welchem Verzeichnis Du Dich gerade befindest (pwd).

2. Freunde Dich mit "find" an. Mit "-size" kannst Du nach Dateien bestimmter Größe suchen und mit "-exec" auf die gefundenen Dateien einen Befehl (mv?) anwenden. Wenn Du etwas genauer mitteilst, was wohin soll kann man auch genauer antworten. Sonst "man find".


Kreol

BeatRider
21.12.06, 22:42
Hi,

ja danke für die Info, aber das ist mit schon alles klar.

Kannst Du mir sagen, wie ich obiges script modifizieren muß, um mittels

echo $i

den kompletten Verzeichnisnamen auszugeben?

suck
22.12.06, 15:45
Dein Script erzeugt bei mir folgende Ausgabe (gekürzt):
3,1M
bin
3,7M
lib
3,8G
qemu_hp.img.save
4,0K
mnt
4,0K
proc
4,0K
srv
4,0K
sysDie Verzeichnisnamen sind schon komplett. Meinst du Datei- und Verzeichnisnamen mit absolutem Pfad? Was willst du mit dieser Ausgabe eigentlich anfangen? Deine beiden Aufgaben kann man mit den schon genannten Befehlen in je einer Zeile erledigen. Wie das geht, weisst du ja sogar schon. Die Zeile für die erste Aufgabe ist 7 Zeichen lang - ziemlich kurz.

BeatRider
22.12.06, 18:15
Hi,
denkst Du da vielleicht an:

rmdir *
Naja - das wäre wohl aber nur die halbe Lösung, denn was ist, falls es noch leere Unterverzeichnisse gibt?

ich möchte auch Verzeichnisse mit Leerzeichen ausgeben. und den String dann nicht in seine Tokens zerlegt bekommen wie bei:


82M
Keane
Album


ich denke es wird auch ein RegEx notwendig sein - habe die Syntax aber noch nicht ganz verstanden:
1) Warum werden bei folgendem Ausdruck keine Verzeichniss mit bspw. 123M oder ähnliches gefunden?



du -sh * | grep -e '[[:digit:]]{3}M*'


2) Wie maskiere ich das Tabulatorzeichen zwischen Größenangabe und Dateiname?

Danke und schönen Gruß

Bunkerwolf
22.12.06, 18:32
also leere Ordner findest du auch mit folgendem Befehl:

find ORDNERNAME -empty

wenn du diese Ordner auch noch löschen willst brauchst du folgende Parameter

-exec rm {} \;

also insgesamt:
find /opt/musik/ -empty -exec rm {} \;



Angenommen du willst jetzt Dateien aus folgende fetten Ordner auf Größe überprüfen:
du befindest dich im Pfad /Bilder/

/Bilder/Städte/Rothenburg
/Bilder/Leute/lustig
/Bilder/Leute/Traurig

find /Bilder/ -mindepth 2 -maxedepth 2 -type d -exec du -s {} \;

Damit zeigt er die die Größe der jeweils zweiten Ordnertiefe an mit dem Namen.
Den Rest kannst du durch eine While Schleife jagen wie z.B.

#!/bin/bash
#Größe in KB
MAXSIZE=40000
# Zielordner wenn Größe überschritten wird
TARGET=/opt/babbelfisch
# Quellordner
SOURCE=/Bilder
find "${SOURCE}" -mindepth 2 -maxdepth 2 -type d -exec du -s {} \; | while read ZEILE;
do
SIZE=$(echo ${ZEILE} | cut -f1 -d" ")
NAME=$(echo ${ZEILE} | cut -f2 -d" ")
if $( test "${SIZE}" -ge "${MAXSIZE}" );
then
echo "${NAME} ist größer als"
# mv ${NAME} ${TARGET}/
fi
done


Dieses packst du in ein Skript und führst es aus... wenn es Stichprobenartig
die richtigen Ordner angibt kannst du die "#" vor der Zeile mv ${NAME)
entfernen...
für das Skript selbst übernehme ich keine Haftung
und es sei angemerkt, dass ich nicht der super Skripter bin. Aber ich bin
für Korrekturen und Verbesserungen bei der Variablenverteilung offen..


viel Spaß damit

ciao

Toni

BeatRider
01.04.08, 19:11
Hi,


zwar ne späte Antwort - trotzdem danke :-)

Gruß
beatrider