web-dev-qa-db-fra.com

Linux - Remplacement d'espaces dans les noms de fichiers

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

83
Mithun Sreedharan

Cela devrait le faire:

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

Je préfère utiliser la commande "renommer", qui prend des expressions régulières de style Perl:

rename "s/ /_/g" *

Vous pouvez faire un essai à sec avec le drapeau -n:

rename -n "s/ /_/g" *
60
DF.

Utilisez sh ...

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

Si vous voulez l'essayer avant d'appuyer sur la gâchette, changez simplement mv en echo mv.

13
DigitalRoss

Que faire si vous souhaitez appliquer la tâche de remplacement récursivement? Comment feriez-vous cela?

Eh bien, je viens de trouver la réponse moi-même. Pas la solution la plus élégante (essaie de renommer également les fichiers qui ne respectent pas la condition) mais 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
4
javipas

Si vous utilisez bash:

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

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

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

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

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

J'espère que cela t'aides.

Citez vos variables:

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

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

1
ghostdog74

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 d'origine avec des guillemets (de awk); puis le nom substitué
  3. xargs prend 2 lignes à la fois et le passe à mv
1
yoogottamk
0
Arthur Frankel

Pour renommer tous les fichiers avec un .py utilisation de l'extension, 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
0
akilesh raj