Linux - Remplacement des espaces dans les noms de fichiers


96

J'ai un certain nombre de fichiers dans un dossier et je souhaite remplacer chaque caractère d'espace dans tous les noms de fichier par des traits de soulignement. Comment puis-je atteindre cet objectif?

Réponses:


172

Cela devrait le faire:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

Cela n'a pas fonctionné pour moi. Il a affirmé que des fichiers identiques existaient (avec les mauvais noms de fichiers). Par exemple, essayer de renommer 1 - foo.jpget mon dossier contenait déjà 1.jpg.
byxor

3
Je trouve que les backticks sont un peu difficiles à lire quand ils sont proches de citations. Le même mais plus lisible seraitfor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

Remarque: Ceci est exécuté à partir de WITHIN le répertoire dont vous souhaitez mettre à jour les noms de fichiers. Vous pouvez également passer *à PATH_TO_YOUR_DIRECTORY.
CFitz

72

Je préfère utiliser la commande 'renommer', qui prend les expressions rationnelles de style Perl:

rename "s/ /_/g" *

Vous pouvez faire un essai avec l'option -n:

rename -n "s/ /_/g" *

3
cela fonctionnera si vous avez le renommage de style perl et non le plus simple redhat / fedora
David Dean

9
la version fedora seraitrename " " "_" *
David Dean

4
renamenon disponible sous OSX il apparaît.
Etienne Low-Décarie

Sur macOS 10.12.3, renameest disponible.
Sung Cho

1
@DavidDean Le changement de nom sous Arch Linux ne remplacera que la première occurrence (pas très pratique pour les fichiers / répertoires avec plusieurs espaces). Il a la même syntaxe que celle de fedora, donc je soupçonne qu'ils peuvent être la même. Mais perl-rename peut être installé.
prosoitos

15

Utilisez sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Si vous voulez essayer ceci avant d'appuyer sur la gâchette, passez simplement mvà echo mv.


4

Si vous utilisez bash:

for file in *; do mv "$file" ${file// /_}; done

quand j'ai essayé, j'ai obtenu mv: lors du déplacement de plusieurs fichiers, le dernier argument doit être un répertoire Essayez mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'pour plus d'informations.
Mithun Sreedharan

Encore une fois erreur mv: argument de fichier manquant Essayez mv --help' for more information. mv: missing file argument Try mv --help 'pour plus d'informations. mv: argument de fichier manquant Essayez mv --help' for more information. mv: missing file argument Try mv --help 'pour plus d'informations.
Mithun Sreedharan

@ levislevis85: Thx, je ne le savais pas.
soulmerge

4

Que faire si vous souhaitez appliquer la tâche de remplacement de manière récursive ? Comment feriez-vous cela?

Eh bien, je viens de trouver la réponse moi-même. Pas la solution la plus élégante, (essaie également de renommer les fichiers qui ne sont pas conformes à la condition) mais cela fonctionne. (BTW, dans mon cas, j'avais besoin de renommer les fichiers avec '% 20', pas avec un trait de soulignement)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

2

Essayez quelque chose comme ça, en supposant que tous vos fichiers étaient .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
obtenu l'erreur ci-dessous tr: deux chaînes doivent être données lors de la traduction de mv: argument de fichier manquant Essayez `mv --help 'pour plus d'informations.
Mithun Sreedharan

2
Erreur Agin tr: trop d'arguments Essayez tr --help' for more information. mv: missing file argument Try mv --help 'pour plus d'informations.
Mithun Sreedharan

2

Voici une autre solution:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. utilise awk pour ajouter des guillemets autour du nom du fichier
  2. utilise sed pour remplacer l'espace par des traits de soulignement; imprime le nom original avec des guillemets (de awk); puis le nom substitué
  3. xargs prend 2 lignes à la fois et le transmet à mv

1

Citez vos variables:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Supprimez l '"écho" pour effectuer le changement de nom réel.


Il reprend parfaitement les commandes mv, mais ne renomme pas vraiment le fichier!
Mithun Sreedharan

la suppression de l'écho produit une erreur comme mv: impossible de stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': aucun fichier ou répertoire de ce type mv: impossible de stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': aucun fichier ou répertoire de ce type
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP ven 14 août 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

Le moyen le plus simple de remplacer une chaîne (caractère espace dans votre cas) par une autre chaîne Linuxconsiste à utiliser sed. Vous pouvez le faire comme suit

sed -i 's/\s/_/g' *

J'espère que cela t'aides.


Cela ne répond pas à la question.
Amit


0

Pour renommer tous les fichiers avec une .pyextension, utilisez, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Exemple de sortie,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
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.