Bizarre opération mv

2

L’utilisation d’un programme de changement de nom a gravement endommagé certains de mes fichiers. J'essaie de les remettre en ordre.

J'ai une structure de fichier comme celle-ci:

./Hello World/some-filename.ext
./Kitty Parade/another.ext
./Third Example/abc.ext
./some-filename.ext2
./another.ext2
./abc.ext2

L'objectif est de déplacer les fichiers du dossier actuel (./) dans leurs dossiers d'origine.

Par exemple:
another.ext2appartient au ./Kitty Parade/dossier
some-filename.ext2appartient au ./Hello World/dossier
abc.ex2appartient au ./Third Example/dossier

La règle peut être décrite comme suit: Si un fichier existe dans le dossier en cours ( ./), recherchez un dossier contenant un fichier portant le même nom de fichier (mais avec une extension différente) et déplacez-le dans ce dossier. Remarque: il n'y a pas de relation fiable entre ./myFilenameet ce fichier ./originalFolderName.

Cela est arrivé à plus de 4 000 fichiers, sinon je le ferais manuellement. Toute aide possible?

Macek
la source

Réponses:

5

Essayez ce morceau de magie shell:

for i in *.*; do
  BASE=$(basename "$i" .ext2)
  LIST=*/"${BASE}".*
  DIR=$(dirname "${LIST}")
  mv -n "$i" "${DIR}"
done

Ou en tant que doublure:

for i in *.*; do mv -n "$i" "$(dirname */"$(basename "$i" .ext2)".*)"; done

Avant:

whitequark@forth:~/test$ ls *
test 1.ext2  test 2.ext2  test 3.ext2

f 1:
test 1.ext

f 2:
test 2.ext  test 3.ext

Après:

whitequark@forth:~/test$ ls *
f 1:
test 1.ext  test 1.ext2

f 2:
test 2.ext  test 2.ext2  test 3.ext  test 3.ext2

Le -ncommutateur vous protégera contre tout écrasement.

Whitequark
la source
ls */"${BASE}".*heh, nice toujours utilisé trouver pour cela.
skarface
lsn'est pas nécessaire: LIST=*/"${BASE}".*et `" $ (dirname " /" $ (nom de base "$ i" .ext2) ". ") "
Dennis Williamson
@ Dennis: merci, changé. cela est resté de la version précédente de la commande.
Whitequark