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.