Supprimer certains caractères de plusieurs fichiers avec des espaces blancs

8

J'essaie de renommer un tas de morceaux de musique dans un répertoire, mais j'ai eu cette erreur:

Lors du déplacement de plusieurs fichiers, le dernier argument doit être un répertoire

Voici le script:

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

Cela fonctionne pour un fichier sans espace, comment modifier ce script?

Casper
la source

Réponses:

14

Utilisez des guillemets:

mv -- "$file" "$(echo "$file" | sed ...)"

Sinon, mvplusieurs arguments apparaissent. Un nom de fichier appelé file name with spacesserait 4 arguments pour mv. Par conséquent , l'erreur: when moving multiple files, last argument must be a directory. Quand mva plus de 2 arguments, cela suppose que vous souhaitez déplacer plusieurs fichiers vers un répertoire (qui serait alors le dernier argument).


Cependant, il semble que vous souhaitiez supprimer les 5 premiers caractères du nom de fichier. Cela peut être fait plus simplement avec bash:

mv -- "$file" "${file:5}"

Edit : j'ai ajouté le --drapeau, grâce au commentaire de @ pabouk . Maintenant, les fichiers commençant par un tiret -sont également correctement traités.

le chaos
la source
2
Cela peut ne pas fonctionner avec les noms de fichiers commençant par -. Au lieu d' echo "$file"utilisation printf '%s\n' "$file".
pabouk
J'ai oublié mv. :) Vous avez géré cette affaire :) --- Ce que je voulais dire, c'était un problème avec echolui-même. Par exemple GNU echo ( à la fois intégré autonome et bash) ne seront pas imprimer ces chaînes: -n, -eet -E. Même selon la définition POSIX, il n'est pas possible de l'utiliser de echomanière fiable car certaines situations ne sont pas définies. Conforme à XSI echointerprètera les séquences d'échappement antislash. --- printf '%s\n'n'a pas de tels effets indésirables et dépendants de la mise en œuvre.
pabouk
3

Vous pouvez utiliser prename, qui est souvent distribué avec Perl. (Par exemple, dans Debian, / usr / bin / prename est installé par le perlpaquet.) S'il n'est pas empaqueté par votre distribution (recherchez prenameet renamedans les emplacements binaires conventionnels), il est disponible pour téléchargement à partir d'un certain nombre d'endroits, tels que par exemple ici , ici ou ici .

Ce script prend une expression régulière à appliquer à chacun des noms de fichiers et un ensemble de noms de fichiers, et modifie les noms de ces fichiers en fonction de cette expression régulière.

Par exemple, vous pourriez faire

prename -v -n 's/^.{5}//' *

pour montrer ce qui se passerait si vous supprimez les cinq premiers caractères des noms de fichiers. Pour réellement exécuter le changement de nom, il vous suffit de supprimer le -n.

un CVn
la source