ubuntuusers.de

Find - Vorhandene Dateien verschieben problem

Status: Ungelöst | Ubuntu-Version: Ubuntu Budgie 22.04 (Jammy Jellyfish)
Antworten |

DPoi

(Themenstarter)
Avatar von DPoi

Anmeldungsdatum:
6. Januar 2015

Beiträge: 356

Boh Jungs… jetzt wird es schwierig für mich.

Ich möchte mit einem Script realisieren, das ich nach Aufruf das Startverzeichnis so bearbeiten kann wie wir es hier zusammen erarbeitet haben.

In diesem Script würde ich nun einige Zeilen mit dem kpl. Find-Befehl und unterschiedlichen Suchbegriffen/Ziel eintragen. Dann sortiert das Script mir das durcheinander in die vorgegebenen Verzeichnisse und ich kann die je nach Priorität abarbeiten. So möchte ich das haben.

Was ihr in den letzten Beiträgen diskutiert leuchtet mir ein, ich denke das man es so einfacher realisieren kann. Wie würde das aussehen wenn ich ein Script mit erstmal 3 Begriffen: wichtig; haus; finanzen; abarbeiten möchte? Das muss ja dann in die for-done Schleife, ne? Mal sehen ob ich das verstehe und auch hinbekomme.

Ihr habt mir hier echt eine Menge beigebracht. Aber das mit den Schleifen ist für mich noch ein Buch mit 7 Siegeln.

Danke und Gruß!

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

DPoi schrieb:

Was ihr in den letzten Beiträgen diskutiert leuchtet mir ein, ich denke das man es so einfacher realisieren kann. Wie würde das aussehen wenn ich ein Script mit erstmal 3 Begriffen: wichtig; haus; finanzen; abarbeiten möchte? Das muss ja dann in die for-done Schleife, ne?

Genau wie rklm schrieb:

1
2
3
4
5
6
7
for operand in wichtig haus finanzen; do 
   mkdir -p "$operand"
 
   for file in *"$operand"*; do 
     [ -f "$file" ] && mv "$file" "$operand"
   done
done

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

karzer schrieb:

DPoi schrieb:

Was ihr in den letzten Beiträgen diskutiert leuchtet mir ein, ich denke das man es so einfacher realisieren kann. Wie würde das aussehen wenn ich ein Script mit erstmal 3 Begriffen: wichtig; haus; finanzen; abarbeiten möchte? Das muss ja dann in die for-done Schleife, ne?

Genau wie rklm schrieb:

1
2
3
4
5
6
7
for operand in wichtig haus finanzen; do 
   mkdir -p "$operand"
 
   for file in *"$operand"*; do 
     [ -f "$file" ] && mv "$file" "$operand"
   done
done

Oder sogar so, dass man die Werte dem Skript übergibt:

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

for operand; do 
   mkdir -p "$operand"
 
   for file in *"$operand"*; do 
     [ -f "$file" ] && mv "$file" "$operand"
   done
done

Oder sogar beides erlauben:

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

[ $# -gt 0 ] || set -- wichtig haus finanzen

for operand; do 
   mkdir -p "$operand"
 
   for file in *"$operand"*; do 
     [ -f "$file" ] && mv "$file" "$operand"
   done
done

Wenn nix übergeben wird, werden "wichtig", "haus" und "finanzen" benutzt.

Zur Sicherheit würde ich auch noch ein cd vorne im Skript einbauen, damit man sicher ist, dass es im korrekten Verzeichnis ausgeführt wird - es sei denn, man will das in verschiedenen Verzeichnissen machen.

Ich füge auch gerne noch oben im Skript ein set -e ein, damit das Skript sofort abbricht, wenn es unbehandelter Fehler auftritt.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

rklm schrieb:

1
2
3
4
5
#!/bin/sh

[ $# -gt 0 ] || set -- wichtig haus finanzen

for operand; do 

Mit for operand kann man einfach über alle Kommandozeilenargumente iterieren?

DPoi

(Themenstarter)
Avatar von DPoi

Anmeldungsdatum:
6. Januar 2015

Beiträge: 356

rklm schrieb:

Oder sogar beides erlauben:

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

[ $# -gt 0 ] || set -- wichtig haus finanzen

for operand; do 
   mkdir -p "$operand"
 
   for file in *"$operand"*; do 
     [ -f "$file" ] && mv "$file" "$operand"
   done
done

Das funktioniert recht gut!! EIne Kleinigkeit ist noch vorhanden. Wenn "wichtig haus finanzen" mit großem Anfangsbuchstaben geschrieben wurden dann werden die nicht erkannt. Wie kann ich dem Script sagen es soll Groß/Kleinschreibung ignorieren? Geht das?

Ansonsten bin ich schonmal seeeehr zufrieden!! 😎

Tx!

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

DPoi schrieb:

Das funktioniert recht gut!! EIne Kleinigkeit ist noch vorhanden. Wenn "wichtig haus finanzen" mit großem Anfangsbuchstaben geschrieben wurden dann werden die nicht erkannt. Wie kann ich dem Script sagen es soll Groß/Kleinschreibung ignorieren? Geht das?

So dürfte es gehen:

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

[ $# -gt 0 ] || set -- wichtig haus finanzen

for operand; do 
   mkdir -p "$operand"
 
   for file in *[A-Za-z]${operand:1}*; do 
     [ -f "$file" ] && mv "$file" "$operand"
   done
done

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

DPoi schrieb:

Das funktioniert recht gut!! EIne Kleinigkeit ist noch vorhanden. Wenn "wichtig haus finanzen" mit großem Anfangsbuchstaben geschrieben wurden dann werden die nicht erkannt. Wie kann ich dem Script sagen es soll Groß/Kleinschreibung ignorieren? Geht das?

Dann brauchst Du die bash und musst shopt -s nocaseglob aufrufen. Dann kannst Du auch gleich noch shopt -s nullglob nutzen.

Ansonsten bin ich schonmal seeeehr zufrieden!! 😎

👍

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

rklm schrieb:

Dann brauchst Du die bash und musst shopt -s nocaseglob aufrufen. Dann kannst Du auch gleich noch shopt -s nullglob nutzen.

Terrific, dieses Wissen. Hut ab.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13131

karzer schrieb:

rklm schrieb:

Dann brauchst Du die bash und musst shopt -s nocaseglob aufrufen. Dann kannst Du auch gleich noch shopt -s nullglob nutzen.

Terrific, dieses Wissen. Hut ab.

Tatsächlich kannte ich "nocaseglob" vor meiner Antwort nicht. Ich habe einfach mal auf Verdacht nachgeschaut (mit Suchwort "case"). 😛

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

rklm schrieb:

Tatsächlich kannte ich "nocaseglob" vor meiner Antwort nicht. Ich habe einfach mal auf Verdacht nachgeschaut (mit Suchwort "case"). 😛

Aber es funktioniert ausgezeichnet! Vielleicht könnte man am Ende noch

shopt -u nocaseglob

einfügen, wenn man danach wieder das natürliche Verhalten haben will

DPoi

(Themenstarter)
Avatar von DPoi

Anmeldungsdatum:
6. Januar 2015

Beiträge: 356

karzer schrieb:

rklm schrieb:

Tatsächlich kannte ich "nocaseglob" vor meiner Antwort nicht. Ich habe einfach mal auf Verdacht nachgeschaut (mit Suchwort "case"). 😛

Aber es funktioniert ausgezeichnet! Vielleicht könnte man am Ende noch

shopt -u nocaseglob

einfügen, wenn man danach wieder das natürliche Verhalten haben will

Wenn ich das ins script einfügen möchte... klappt nicht. Verstehe ich da was nicht?

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

DPoi schrieb:

karzer schrieb:

rklm schrieb:

Tatsächlich kannte ich "nocaseglob" vor meiner Antwort nicht. Ich habe einfach mal auf Verdacht nachgeschaut (mit Suchwort "case"). 😛

Aber es funktioniert ausgezeichnet! Vielleicht könnte man am Ende noch

shopt -u nocaseglob

einfügen, wenn man danach wieder das natürliche Verhalten haben will

Wenn ich das ins script einfügen möchte... klappt nicht. Verstehe ich da was nicht?

Das deaktiviert die Option, die wie

rklm schrieb:

DPoi schrieb:

Das funktioniert recht gut!! EIne Kleinigkeit ist noch vorhanden. Wenn "wichtig haus finanzen" mit großem Anfangsbuchstaben geschrieben wurden dann werden die nicht erkannt. Wie kann ich dem Script sagen es soll Groß/Kleinschreibung ignorieren? Geht das?

Dann brauchst Du die bash und musst shopt -s nocaseglob aufrufen. Dann kannst Du auch gleich noch shopt -s nullglob nutzen.

erst aktiviert werden muss. Also erstmal shopt -s nocaseglob im Terminal ausführen, dann nach Ausführung des Skripts vielleicht noch mal shopt -u nocaseglob, wenn Du danach wieder normales ls-Verhalten haben willst.

DPoi

(Themenstarter)
Avatar von DPoi

Anmeldungsdatum:
6. Januar 2015

Beiträge: 356

karzer schrieb:

erst aktiviert werden muss. Also erstmal shopt -s nocaseglob im Terminal ausführen, dann nach Ausführung des Skripts vielleicht noch mal shopt -u nocaseglob, wenn Du danach wieder normales ls-Verhalten haben willst.

Ja, das habe ich so gemacht. Aber das klappt nicht. Erst im Terminal 'shopt -s nocaseglob' dann das Script und er macht trotzdem nur die kleingeschriebenen files. Ich habe aber auch irgendwo gelesen das shopt bei Ubuntu nicht funktioniert?! Muss ich nochmal suchen.

Hmm...

DPoi

(Themenstarter)
Avatar von DPoi

Anmeldungsdatum:
6. Januar 2015

Beiträge: 356

karzer schrieb:

for file in *[A-Za-z]${operand:1}*; do

Meldung nach start: sortieren.sh: 8: Bad substitution

Da komme ich nicht weiter... ☺

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1497

Wohnort: Bad Oeynhausen

DPoi schrieb:

karzer schrieb:

erst aktiviert werden muss. Also erstmal shopt -s nocaseglob im Terminal ausführen, dann nach Ausführung des Skripts vielleicht noch mal shopt -u nocaseglob, wenn Du danach wieder normales ls-Verhalten haben willst.

Ja, das habe ich so gemacht. Aber das klappt nicht. Erst im Terminal 'shopt -s nocaseglob' dann das Script und er macht trotzdem nur die kleingeschriebenen files.

Führe das nochmal aus (also shopt -s nocaseglob) und dann versuche ls -l *wichtig*. Dann guck, ob die großgeschriebenen wichtig's mitausgegeben werden.