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?
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:
Cela devrait le faire:
for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
for file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
*
à PATH_TO_YOUR_DIRECTORY
.
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" *
rename " " "_" *
rename
non disponible sous OSX il apparaît.
rename
est disponible.
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
.
Si vous utilisez bash:
for file in *; do mv "$file" ${file// /_}; done
mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try
mv --help 'pour plus d'informations.
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.
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
Essayez quelque chose comme ça, en supposant que tous vos fichiers étaient .txt:
for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
tr --help' for more information. mv: missing file argument Try
mv --help 'pour plus d'informations.
Voici une autre solution:
ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
Citez vos variables:
for file in *; do echo mv "'$file'" "${file// /_}"; done
Supprimez l '"écho" pour effectuer le changement de nom réel.
\'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
Le moyen le plus simple de remplacer une chaîne (caractère espace dans votre cas) par une autre chaîne Linux
consiste à utiliser sed
. Vous pouvez le faire comme suit
sed -i 's/\s/_/g' *
J'espère que cela t'aides.
Je crois que votre réponse est dans Remplacer les espaces dans les noms de fichiers par des traits de soulignement .
Pour renommer tous les fichiers avec une .py
extension, 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
1 - foo.jpg
et mon dossier contenait déjà1.jpg
.