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?

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.