J'ai nommé un certain nombre de fichiers contenant des espaces et je souhaite remplacer l'espace par _
. Cependant, chaque fois que j'écris une commande dans le shell avec le nom du fichier (par exemple, Spring 2011
), le shell ne reconnaît pas le fichier ou le répertoire.
Que puis-je faire à ce sujet? Est-il possible d'utiliser le caractère Unicode pour un espace?
Échapper à l'espace, par exemple Spring\ 2011
, ou utilisez des guillemets, par exemple 'Spring 2011'
. À l'avenir, il est généralement déconseillé d'utiliser des noms de fichiers contenant des espaces dans n'importe quel * NIX.
Si vous avez rename
, vous pouvez utiliser ceci:
rename ' ' '_' [filenames...]
Si votre ordinateur dispose de la commande rename , tous les espaces sont soulignés dans tous les fichiers/répertoires du répertoire de travail en cours:
rename 's/ /_/g' *
Si vous n'avez pas rename
ou préférez utiliser uniquement le shell:
for f in *\ *; do mv "$f" "${f// /_}"; done
En panne:
*\ *
sélectionne tous les fichiers avec un espace dans leur nom comme entrée pour la boucle for
."$f"
sont importants, car nous savons qu'il y a un espace dans le nom du fichier. Sinon, il apparaît sous la forme de 2 arguments ou plus pour mv
.${f//str/new_str}
est une fonctionnalité de substitution de chaîne spécifique à bash. Toutes les instances de str
sont remplacées par new_str
.mv "Spring 2011.file" Spring_2011.file
devrait indiquer à la ligne de commande de prendre la chaîne citée comme une seule entrée.
Pour renommer par programme des fichiers N, vous pouvez utiliser une simple boucle bash
pour (boucle).
#!/bin/bash
set -eux
# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here
# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS
# for each filename
for filename in "${tmp[@]}"; do
# rename the filename to use "_" character instead of a " " character
mv -v "${filename}" "${filename// /_}"
done
Si vous avez moins de 5 noms de fichiers, vous pouvez taper manuellement tous les noms de fichiers et utiliser la commande rename
comme celle ci-dessus suggère. Mais pour moi ... je préfère la solution programmatique ... même s'il n'y a que 4 fichiers.
p.s.
si vous n'êtes pas familier avec l'extension de paramètre de Bash
(c'est-à-dire ${filename// /_}
), vous pouvez utiliser la commande rename
:
if ((0)); then
mv -v "${filename}" "${filename// /_}"
else
rename ' ' '_' "${filename}"
fi