web-dev-qa-db-fra.com

Comment renommer des fichiers avec des espaces en utilisant le shell Linux?

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?

26
Phil Braun

É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...]
32
Rafe Kettler

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' *
29
unutbu

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.
  • Les guillemets autour de "$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.
23
blahdiblah

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.

3
rockerest

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
0