Linux Dateien aus Unterordnern verschieben

Gast #7195223
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..
Gast
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
Gast
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
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.