Forum: PC-Programmierung Linux Dateien aus Unterordnern verschieben


von Rolli (Gast)


Lesenswert?

Hallo

Ich möchte alle Dateien aus Subfoldern in ein bestimmtes Verzeichnis 
verschieben und dort wiederum in einen Ordner der die Bezeichnung der 
Extension der Datei trägt.

Für den zweiten Teil der Aufgabe verwende ich bereits folgendes script:
1
for filename in *; do
2
  if [[ -f "$filename" ]]; then
3
      base=${filename%.*}
4
      ext=${filename#$base.}
5
    mkdir -p "${ext}"
6
    mv "$filename" "${ext}"
7
  fi
8
done

Kann jemand helfen, das Script mit dem ersten Teil zu vervollständigen? 
Wichtig wäre natürlich auch, dass man bereits existierende Dateien nicht 
überschreibt sondern umbenennt..

von scriptkiddy (Gast)


Lesenswert?

Rolli schrieb:
> Hallo
>
> Ich möchte alle Dateien aus Subfoldern in ein bestimmtes Verzeichnis
> verschieben und dort wiederum in einen Ordner der die Bezeichnung der
> Extension der Datei trägt.
:
:
> Kann jemand helfen, das Script mit dem ersten Teil zu vervollständigen?
> Wichtig wäre natürlich auch, dass man bereits existierende Dateien nicht
> überschreibt sondern umbenennt..

Welche Datei WIE umbenennen? Das musst Du genauer definieren...

Ersetze das simple globbing durch eine beliebige Befehlssequenz ( 
gerne auch mit filternde Pipe) um mehr Dateien zu "greifen" als bloss 
jene im lokalen Verzeichnis.
1
for filename in $( find  .  -type f )
2
do
3
  if [[ -f "$filename" ]]; then
4
       base=${filename%.*}
5
      ext=${filename#$base.}
6
     mkdir -p "${ext}"
7
    mv "$filename" "${ext}"
8
  fi
9
 done

von Rolli (Gast)


Lesenswert?

scriptkiddy schrieb:
> Welche Datei WIE umbenennen?

also nehmen wir mal an, die Datei example.xyz im Verzeichnis OrdnerA ist 
in den Ordner xyz verschoben worden.
Wenn nun eine Datei example.xyz im Verzeichnis OrdnerB wieder in den 
Ordner xyz verschoben wird, soll sie die dort bestehende nicht 
überschreiben sondern umbenannt werden, z.b. example_001.xyz

von Alexander (alecxs)


Lesenswert?

auf welchem Dateisystem? enthalten Dateinamen evtl. Leerzeichen?

von Alexander (alecxs)


Lesenswert?

Auf einem ext4 Dateisystem kann man statt zu verschieben Hardlinks 
erstellen und dann das Original löschen. Damit kann man die Backup 
Option von copy nutzen und Dateien automatisch umbenennen. Wenn 
Dateinamen Leerzeichen enthalten muss man aber find -exec benutzen (oder 
find while read loop oder ähnliches).

Hier noch eine andere idiotensichere (langsame) Lösung. Es werden auch 
Symlinks verschoben, und Dateien ohne Endung werden ignoriert.
1
#!/bin/bash
2
3
quelle=$PWD
4
ziel="$PWD/Neuer Ordner"
5
6
verschieben ()
7
{
8
  [ -e "$1" ] || exit 2
9
  name=${1##*/}
10
  ext=${name##*.}
11
  [ "$name" = "$ext" ] && return 0
12
  echo "'$1'"
13
  mkdir -p "$ziel/${ext^^}"
14
  cp --backup=numbered -al "$1" "$ziel/${ext^^}" && rm "$1"
15
  return 0
16
}
17
18
[ -n "$1" ] && verschieben "$1" && exit 0
19
20
mkdir -p "$ziel"
21
find "$quelle" -mindepth 2 ! -type d ! -ipath "*$ziel/*" -exec "$(realpath "$0")" {} \;
22
23
exit 0

Das exclude des Zielpfads ist nicht ganz sauber, daher sollte man einen 
Ordnernamen verwenden der nicht existiert (auch nicht als Pattern).
Tipp: Wenn man statt -exec -execdir benutzt werden die Ordner 
stattdessen in den jeweiligen Unterordnern angelegt.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.