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?

Mithun Sreedharan
la source

Réponses:

172

Cela devrait le faire:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
neesh
la source
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" *
DF.
la source
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.

DigitalRoss
la source
4

Si vous utilisez bash:

for file in *; do mv "$file" ${file// /_}; done
Vice-président de Murali
la source
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
javipas
la source
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
Amir Afghani
la source
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
yoogottamk
la source
1

Citez vos variables:

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

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

ghostdog74
la source
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.

Desta Haileselassie Hagos
la source
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
akilesh raj
la source