staging.inyokaproject.org

2 Ordner vergleichen und nur den letzten Unterordner löschen

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Phanom

Anmeldungsdatum:
28. April 2013

Beiträge: 222

Hallo Gurus

Ich habe eine Musiksammlung die durch falsche Benutzung des Programm-es Musicbrainz Picard mehre Dateien durcheinander gebracht hat. Jetzt ziehe ich mir die CDs wieder auf den Rechner und suche eine Lösung die Alten zu löschen wenn sie neu erstellt wurden Warum ich sie nicht einfach überschreiben lassen von Audexhat mehrere Gründe wie neue Festplatte,CDs die zerkratzt sind, Demo CDs und CDs die von mein Bruder sind die ich später leider per Hand dann sortieren muss.

Meine Idee ist finde den letzten Ordner eines Verzeichnisses auf Beiden Festplatten und Lösche den wenn vorhanden auf der alten Festplatte Ignoriere groß und klein Schreibung und suche beide Schreibweisen ö;ü;ä;ß oe;ue;ae;ss und zum schluß

1
find . -type d -empty -delete

Leider bin ich zu Blöd das in ein bash-skript zu schreiben und bitte um Hilfe

Meine Aufstellung der Interpreten

Musik alt bzw neu
--------->Interpret1
-------------------->Album 1
-------------------->Album 2
-------------------->Doppelalbum
-------------------------------->CD1
-------------------------------->CD2
--------->Interpret2
-------------------->Album 1
-------------------->Album 2
-------------------->Doppelalbum
-------------------------------->CD1
-------------------------------->CD2
usw

Vielen Dank

Gruß Phanom

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Mir ist nicht ganz klar was Du sagen willst.

Meine Idee ist finde den letzten Ordner eines Verzeichnisses auf Beiden Festplatten und Lösche den wenn vorhanden auf der alten Festplatte

Also in Deinem Beispiel beispielsweise Album 1, Album 2, Doppelalbum/CD1, Doppelalbum/CD2 aber nicht Doppelalbum selbst oder Interpret1? Außer die wären leer, nachdem Du die Unterordner gelöscht hast?

Phanom

(Themenstarter)

Anmeldungsdatum:
28. April 2013

Beiträge: 222

Ok versuche es anders zu erklären

Alte Festplatte:
~HOME/500GBFestplatte/Metalica/S&M/CD1
~HOME/500GBFestplatte/Metalica/S&M/CD2
~HOME/500GBFestplatte/Metalica/Live USA
~HOME/500GBFestplatte/Variusartist/100%Rock-vol1/CD1
~HOME/500GBFestplatte/Variusartist/100%Rock-vol1/CD2
~HOME/500GBFestplatte/Variusartist/100%Rock-vol1/CD3
Neue Festplatte
Audex erstellt alles neu
~HOME/2TBFestplatte/Metalica/S&M/CD1
~HOME/2TBFestplatte/Metalica/S&M/CD2
~HOME/2TBFestplatte/Variusartist/100%Rock-vol1/CD1
~HOME/2TBFestplatte/Variusartist/100%Rock-vol1/CD2
die CD 3 ist nicht vorhanden

das Skript soll jetzt fragen ob die Ordner von der 2TB Festplatte auf der 500GB Festplatte vorhanden sind wenn ja dann lösche diese auf der 500gb Festplatte. Bei meinen Beispiel soll das skript erst die Metalica/S&M/CD1 dann Metalica/S&M/CD2 löschen da dann der Ordner Metalica/S&M leer wäre diesen dann löschen Metalica aber noch lassen bis diese auch leer wäre wenn dieser irgend wann leer ist auch löschen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
find  -type d ~HOME/500GBFestplatte/Metalica/S&M/CD1
find  -type d ~HOME/2TBFestplatte/Metalica/S&M/CD1

if [ -d ~HOME/2TBFestplatte/Metalica/S&M/CD1 ]
 then

#Löscht Alte Datei
rm -r ~HOME/500GBFestplatte/Metalica/S&M/CD1

else

#Datei nicht vorhanden nehme nächsten Ordner und führe die schleife mit diesem durch


      fi

find . -type d -empty -delete

hoffe ist besser erklärt zu beachten ist das Groß- und Kleinschreibung zu ignorieren ist und das umlaute normal und ae ue oe geschrieben sein könnten

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Phanom schrieb:

Was soll "~HOME" bedeuten? Normalerweise schreibt man nur "~".

das Skript soll jetzt fragen ob die Ordner von der 2TB Festplatte auf der 500GB Festplatte vorhanden sind wenn ja dann lösche diese auf der 500gb Festplatte.

Ist es ungefähr so etwas?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sh

other=$(cd ~/500GBFestplatte && pwd) || exit

cd ~/2TBFestplatte || exit

find -depth -type d -exec sh -c '
for dir; do
  rm -r "$other/$dir"
done
' -- {} +

Zum Ausprobieren am besten ein echo vor das rm setzen.

Anmerkung: man benötigt hier keinen Test auf Existenz. Es gibt halt ein paar Fehler.

Oh, man kann es sogar vereinfachen zu:

1
2
3
4
5
6
7
#!/bin/sh

other=$(cd ~/500GBFestplatte && pwd) || exit

cd ~/2TBFestplatte || exit

find -depth -type d -exec rm -r "$other/{}" \;

Wichtig ist, dass in "other" ein absoluter Pfad steht und man mit cd in das Verzeichnis wechselt, in dem gesucht wird, damit man die relativen Pfade nutzen kann. Und bloß nicht "rm -rf" verwenden, weil das zu viel löscht!

Phanom

(Themenstarter)

Anmeldungsdatum:
28. April 2013

Beiträge: 222

Ich habe es mit Testordnern versucht und es funktioniere Ja wunderbar aber es löscht leider zu viel

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
~/test/alt/Cavalera Conspiracy$ ls
Blunt Force Trauma  Inflikted  Pandemonium

~/test/neu/Cavalera Conspiracy$ ls
Blunt Force Trauma  Pandemonium

~/test/alt/Cavalera Conspiracy$ cd
quattro@Phanom:~$ other=$(cd ~/test/alt && pwd) || exit
quattro@Phanom:~$ 
quattro@Phanom:~$ cd ~/test/neu || exit
quattro@Phanom:~/test/neu$ 
quattro@Phanom:~/test/neu$ find -depth -type d -exec rm -r "$other/{}" \;
rm: Entfernen von '.' Verzeichnis '..' nicht möglich: '/home/quattro/test/alt/.' wird übersprungen
quattro@Phanom:~/test/neu$ ls ~/test/alt
~/test/alt$ ls ~/test/neu
Cavalera Conspiracy

es darf weder ~/test/alt/Cavalera Conspiracy/Inflikted/ gelöscht werden noch die Übergeordneten Ordner da /Inflikted/ noch nicht im neuen Laufwerk vorhanden ist.

deswegen mit die Idee mit find meine erste Überlegung war direkt nach mp3 Dateien zu suchen und zu löschen doch das geht auch nicht da ja ich somit die Musiksammlung zerschossen habe hier ein Beispiel

1
2
3
4
 find /home/quattro/Musik/musik_alt/ -name "01 Intro.mp3"
/home/quattro/Musik/musik_alt/Musik_Sotieren/O/Ozzy Osbourne/1993 Live & Loud CD 1/01 Intro.mp3
/home/quattro/Musik/musik_alt/Musik_Sotieren/The Inchtabokatables/Inchtomanie/01 Intro.mp3
.......usw

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Autsch! Ja, Du hast Recht. Es gäbe die Möglichkeit, entweder zu prüfen, ob in einem Verzeichnis mindestens eine Datei ist (und nicht etwa nur Verzeichnisse) oder man nutzt die Kenntnis über die Struktur aus und macht es so:

1
find -mindepth 2 -depth -type d -exec rm -r "$other/{}" \;

Das geht davon aus, dass die Struktur in jedem Falle "artist/release/track.mp3" ist. Wenn die Musikdateien in unterschiedlicher Tiefe liegen, wird es komplizierter. Vielleicht so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sh

other=$(cd ~/500GBFestplatte && pwd) || exit

cd ~/2TBFestplatte || exit

find -depth -type f -iname \*.mp3 -exec sh -c '
for f; do
  rm -r "$other/$(dirname "$f")"
done
' -- {} +

Das produziert jede Menge Fehlermeldungen, die Du aber ignorieren kannst. Jetzt müsste auch ein rm -rf OK sein. Man könnte es auch so noch sicherer machen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/sh

other=$(cd ~/500GBFestplatte && pwd) || exit

cd ~/2TBFestplatte || exit

find -depth -type f -iname \*.mp3 -exec sh -c '
for f; do
  rm "$other/$f"
  rmdir "$other/$(dirname "$f")"
done 2>/dev/null
' -- {} +

Jetzt werden wirklich nur die Verzeichnisse gelöscht, die mp3s enthalten.

Phanom

(Themenstarter)

Anmeldungsdatum:
28. April 2013

Beiträge: 222

Funktioniert auch nicht findet nichts 😬

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
find -depth -type f -iname \*.mp3 -exec sh -c '
> for f; do
>   rm -r "$other/$(dirname "$f")"
> done
> ' -- {} +
rm: das Entfernen von '/./Cavalera Conspiracy/Blunt Force Trauma' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
rm: das Entfernen von '/./Cavalera Conspiracy/Blunt Force Trauma' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
rm: das Entfernen von '/./Cavalera Conspiracy/Blunt Force Trauma' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
rm: das Entfernen von '/./Cavalera Conspiracy/Pandemonium' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
rm: das Entfernen von '/./Cavalera Conspiracy/Pandemonium' ist nicht möglich: Datei oder Verzeichnis nicht gefunden
quattro@Phanom:~/test/neu$ ls ~/test/alt/Cavalera\ Conspiracy/
Blunt Force Trauma  Inflikted  Pandemonium
quattro@Phanom:~/test/neu$ ls ~/test/neu/Cavalera\ Conspiracy/
Blunt Force Trauma  Pandemonium

meine Vorstellung war vergleiche Ordner und wenn der Ordner vorhanden ist lösche den Inhalt des Ordners danach suche leere ordner und lösche sie aber NICHT rm -r da dann auch volle Ordner gelöscht werden Beispiel wie es mein wissen es zulässt leider fehlen mir bestimmte Kenntnisse

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env bash
#müsste das zwischenspeichern weiß aber nicht wie sagen wir alt=$
find ~/test/alt/   -type d 
/home/quattro/test/alt/
/home/quattro/test/alt/Cavalera_Conspiracy
/home/quattro/test/alt/Cavalera_Conspiracy/Inflikted
/home/quattro/test/alt/Cavalera_Conspiracy/Blunt Force Trauma
/home/quattro/test/alt/Cavalera_Conspiracy/Pandemonium

# müsste das auch zwischenspeichern weiß aber nicht wie sagen wir neu=$
find ~/test/neu/   -type d 
/home/quattro/test/neu/
/home/quattro/test/neu/Cavalera_Conspiracy
/home/quattro/test/neu/Cavalera_Conspiracy/Blunt Force Trauma
/home/quattro/test/neu/Cavalera_Conspiracy/Pandemonium
if [ $alt = $neu ] # das in einer schleife bis alle Ordner verglichen wurden
then 
rm $alt/*.* # ich benutze rm um den Inhalt erst mal zu löschen dadurch bleiben die Ordner die nicht auf $neu existieren auf alt unberührt "denke ich"
fi
#und zum Schluss leere Ordner löschen
find ~/test/alt/ -type d -empty -delete 

hoffe das ich euch nicht damit belästige mit der denkweise

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Hast Du Dir denn die Fehlermeldung mal angeguckt ? 😲

Du versuchst zu löschen:

"$other/$(dirname "$f")"

und bei ihm kommt dort an:

/./Cavalera Conspiracy/Blunt Force Trauma'

... ganz offensichtlich ist dort also die Variable $other leer !

Du solltest Dir mal genau überlegen, was Du machen willst, und nicht so wild drauf los probieren.

Der wichtigste, erste Schritt wäre wohl, mal zu überlegen, wie Du von dem "alten" auf den "neuen" Pfad kommen kannst. Sowas klappt ganz sichern nicht per blindem Versuch, sondern nur mit genauer Planung.

Was hältst Du davon, die Grundpfade und das find hier sauber zu trennen  ? :

1
2
3
4
5
6
7
8
9
export alt="/home/quattro/test/alt/"
export neu="/home/quattro/test/neu/"

cd "$neu"
find -type f -name \*.mp3 -exec sh -c '
> for f; do
>     echo rm "$alt$f"
> done
> ' -- {} +

Dann siehst Du ja, ob das was er tun würde überhaupt passt. Wenn ja, dann kannst Du das echo wegmachen und ihn damit scharf schalten.
Und als Nächstes dann die ganzen leeren Verzeichnisse löschen. (→ rmdir -p )

LG,

track

p.s.:
Ich sehe gerade - erst die Dateinamen massenweise zu übergeben und danach mit einer extra Schleife wieder zu trennen, ist ja auch Quatsch !
Dann kann man besser gleich die Dateien einzeln abarbeiten:

1
2
3
4
5
export alt="/home/quattro/test/alt/"
export neu="/home/quattro/test/neu/"

cd "$neu"
find -type f -name \*.mp3 -exec sh -c 'echo rm -- "$alt$1"' -- {} \;

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Zum löschen von Verzeichnissen sollte man rmdir benutzen. Das löscht überhaupt nur Verzeichnisse und nur leere.

Phanom

(Themenstarter)

Anmeldungsdatum:
28. April 2013

Beiträge: 222

Vielen Dank jetzt hat es fast so funktioniert wie ich es gemeint habe mit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
export alt="/home/quattro/test/alt/"
export neu="/home/quattro/test/neu/"
# Erste Durschlauf geändert auf iname wegen groß klein Schreibung
cd "$neu"
find -type f -iname \*.* -exec sh -c 'rm -- "$alt$1"' -- {} \; 

#Zweite Durschlauf mit geänderten großen Umlaute sicherheitshalber
find /home/quattro/test/alt/ -depth -execdir rename 's/Ä/Ae/g;s/Ö/Oe/g;s/Ü/Ue/g;s/ß/ss/g' "{}" \;
find -type f -iname \*.* -exec sh -c 'rm -- "$alt$1"' -- {} \;

#Dritter Durschlauf mit geänderten kleinen Umlaute sicherheitshalber
find /home/quattro/test/alt/ -depth -execdir rename 's/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/\"//g;s/\?//g' "{}" \;
find -type f -iname \*.* -exec sh -c 'rm -- "$alt$1"' -- {} \;

#Vierter Durschlauf mit geänderten Zeischen 
find /home/quattro/test/alt/ -depth -execdir rename "s/\'//g;s/\`//g;s/\'//g;s/\&/und/g;s/\ /_/g;" "{}" \;
find -type f -iname \*.* -exec sh -c 'rm -- "$alt$1"' -- {} \;

find ~/test/alt/ -type d -empty -delete

ist zwar immer noch mit Fehlern versehen da leider die Schreibweisen noch mehr Unterschied haben können aber hat bestimmt schon 80 % der Dateien erkannt und verglichen. Gebe mich damit zufrieden

noch ein Beispiel der Schreibweise was ich meinte mit ignorieren

01 - Alle Vögel sind schon da
01 - ALLE VÖGEL SIND SCHON DA
01-alle Vögel.....
01 - Alle_Vögel_ ......
und untereinander kann es noch variieren

Vielen Dank noch mal an alle die mir helfen wollten und konntentrack schrieb:

Hast Du Dir denn die Fehlermeldung mal angeguckt ? 😲

Du versuchst zu löschen:

"$other/$(dirname "$f")"

und bei ihm kommt dort an:

/./Cavalera Conspiracy/Blunt Force Trauma'

... ganz offensichtlich ist dort also die Variable $other leer !

Ja hatte ich auch gesehen das die Variable leer ist leider bin ich zu dumm um sie zu füllen 😉 nicht böse gemeint 😇

Vielen Dank noch mal an alle die mir helfen wollten und konnten Ihr seit die besten

Gruß Phanom

Antworten |