Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?
18.09.2021, 16:54:41

.
Einloggen mit Benutzername, Passwort und Sitzungslänge

Mitglieder
Statistiken
  • Beiträge insgesamt: 754255
  • Themen insgesamt: 60645
  • Heute online: 594
  • Am meisten online: 2287
  • (22.01.2020, 19:20:24)
Benutzer Online

Autor Thema: [gelöst]  Dateien umsortieren - Für jede Datei einen Ordner mit dem Dateinamen anlegen  (Gelesen 1177 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

[gelöst] Re: Dateien umsortieren - Für jede Datei einen Ordner mit dem Dateinamen anlegen
« Antwort #15 am: 22.06.2021, 18:20:25 »
Hallo van Neel,

ich kann es auch nicht 100% sagen. Ich denke es geht hauptsächlich um Zeichen, die in einem Dateinamen sein können, wo ls Probleme bekommt: Kommas, Newline, Leertaste etc. Alles geht in Linux.

Bei Leerzeichen im Dateinamen habe ich mir in Shellskripten immer angewöhnt, Parameter zu quoten, dass heißt mit Anführungszeichen einzurahmen. Sonst interpretiert der Befehl durch das Leerzeichen den Namen als zwei Bestandteile, was so nicht von dir gewollt ist: zum Beispiel find "$PATH" anstelle find $PATH

Details siehe
http://mywiki.wooledge.org/ParsingLs

Danke erst einmal für die Hinweise.

Das mit dem Quotieren habe ich zuerst ausprobiert, da ich z.B. Leerzeichen in Ordner- oder Dateinamen berücksichtigen wollte.
Leider habe ich das bei den Arrays nicht richtig hinbekommen. Jedenfalls hat es nicht funktioniert.

Nehmen wir das Beispiel:
dateiname=( ${alledateien[@]%.*} )
Wo genau muss ich da die Anführungszeichen setzen?

Wenn es nicht unbedingt Bash sein muss, mit Python hast du mit Leerzeichen und Quoting keine Probleme:

#!/usr/bin/python3

from pathlib import Path
from shutil import move


STARTPATH = '/home/vanneel/Schreibtisch/test'


def handle_one_folder(path):
    parent = path.parent
    for item in path.iterdir():
        if item.is_file():
            new_folder = parent / item.stem
            new_folder.mkdir(exist_ok=True)
            move(item, new_folder)


def main():
    path = Path(STARTPATH)
    seen = set()
    for item in path.iterdir():
        if item.is_dir():
            handle_one_folder(item)
            seen.add(item)
    for old_dir in seen:
        try:
            old_dir.rmdir()
        except OSError:
            print(f'Folder {old_dir.name} is not empty.')


if __name__ == '__main__':
    main()

Gruß
Whitie

Jetzt habe ich wieder ein Problem.

Ich habe eine Kopie des Scriptes gemacht und damit gearbeitet.
Und zwar habe ich versucht die ls-Befehle durch find zu ersetzen. (ich will ja etwas lernen :-)  )

Bisher habe ich das nicht geschafft, aber das wird schon noch klappen.

Mein Problem: Das orginal Script habe ich NICHT verändert, aber jetzt meldet es am Schluss Fehler.
Angeblich findet es beim Ausführen der Zeile
find . -type d -empty -exec rmdir {} \;die leeren Ordner nicht. Was aber eindeutig falsch ist, da die gelöscht werden und das Script seine Aufgabe erfüllt.

Wenn ich der Zeile ein -maxdepth 1 hinzufüge ist alles OK. Das war vorher aber nicht nötig.
Im Prinzip ist es so , dass jetzt ohne Angabe von maxdepth dessen Wert IMMER 2 ist.

Kann es sein, dass ich beim Arbeiten mit dem find-Befehl sozusagen eine Grundeinstellung verstellt habe? Und wenn ja wie kann man das zurücksetzen.
Als Optionen habe ich eigentlich nur -type d bzw f und -maxdepth 0 bzw 1 und 2 verwendet

« Letzte Änderung: 24.06.2021, 08:20:29 von van Neel »

neo67

  • Administrator
  • *****
Kann es sein, dass ich beim Arbeiten mit dem find-Befehl sozusagen eine Grundeinstellung verstellt habe? Und wenn ja wie kann man das zurücksetzen.
Als Optionen habe ich eigentlich nur -type d bzw f und -maxdepth 0 bzw 1 und 2 verwendet
Nein, die Einstellungen gelten nur für die jeweilige Bash-Sitzung.

Danke für den Hinweis.

Ich habe jetzt verschiedene Versuche gemacht. Neues Terminal gestartet, das System neugestartet etc.
Das Script hat vor meinen "find-Versuchen" immer ohne die Option -maxdepth funktioniert.
Jetzt muss ich explizit -maxdepth 1 hinzufügen, ansonsten verhält es sich so, wie wenn -maxdepth 2 eingestellt wäre.

Gut es ist kein Problem, das hinzuzufügen, aber es wundert mich halt doch.

Zusatzfrage: Kann man den Befehl find sozusagen solo neuinstallieren, oder muss man da die ganze bash erneuern?
Wenn ja - wie geht das?


Danke für den Link.
Die Seite hatte ich schon gelesen und "abgespeichert", da ich den find-Befehl noch besser kennenlernen will.
Ebenso die terminal-Hilfe "man find".

Wie man die Bash neuinstalliert, habe ich jetzt auch gefunden.
Habe es allerdings nicht über das Terminal sondern über die Synaptic Paketverwaltung gemacht.

Hat aber alles nichts daran geändert, dass ich jetzt im Script bei der Befehlszeile :
find . -type d -empty -exec rmdir {} \;
ein -maxdepth 1 hinzufügen MUSS, damit keine  Fehlermeldung kommt, wie wenn die Voreinstellung maxdepth 2 wäre.

Hier nochmal das Ganze mit "find" statt "ls"
#!/bin/bash
#

i=""
x=""
pfad="/home/vanneel/Schreibtisch/test"
BackupIFS="$IFS"
IFS=$(echo -en "\n\b")

cd $pfad
alleordner=( $(find -maxdepth 1 -type d) )
for i in ${alleordner[@]}
  do
    cd $pfad/$i
    alledateien=( $(find -maxdepth 1 -type f) )
    dateiname=( ${alledateien[@]%.*} )
    for x in ${dateiname[@]}
      do
        if ! [ -d $pfad/$x ]
          then
            mkdir $pfad/$x
        fi
        mv -f $pfad/$i/$x.* $pfad/$x
    done
done

cd $pfad
find . -maxdepth 1 -type d -empty -exec rmdir {} \;

IFS="$BackupIFS"