web-dev-qa-db-fra.com

Renommer des fichiers et des dossiers avec des caractères spéciaux

Luttant avec celui-ci et googler cela ne semble pas me donner la solution qui fonctionne.

J'ai un dossier nommé ...

file å?? name.txt

par exemple, et pour éviter les problèmes, je veux le renommer, mais j’ai du mal à comprendre comment. J'ai essayé d'utiliser ' ' et j'ai également essayé d'utiliser \ avant chaque caractère spécial, par exemple. 'file \å\?\? name \(2008\).txt' mais je viens d'avoir l'erreur suivante ...

-bash: cd: file \å\?\? name \(2008\).txt : No such file or directory

Est-ce une utilisation inappropriée de \ ou ai-je besoin d'une approche alternative?

Merci

3
spcurtis81

Le problème ne réside pas dans les caractères non-ASCII, votre shell peut parfaitement traiter å. Le problème est que votre fichier n'est pas nommé å??. S'il en était ainsi, rm 'å??' ou même rm å?? aurait fonctionné.

Vous supposez que c'est å?? parce que c'est ce que ls montre, et c'est une hypothèse raisonnable, mais ls montrera diverses choses comme ?. Par exemple:

$ mkdir "file å"\?\?" name.txt" "file å"$'\n'$'\n'" name.txt" "file å"$'\t'$'\t'" name.txt" "file å"$'\r'$'\r'" name.txt" "file å"$'\b'$'\b'" name.txt" "file å"$'\v'$'\v'" name.txt"

$ ls -l
total 24K
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:01 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt
drwxr-xr-x 2 terdon users 4.0K Nov  8 13:02 file å?? name.txt

Comme vous pouvez le voir ci-dessus, les nouvelles lignes, les tabulations, les retours chariots, les cloches et les tabulations verticales (entre autres) sont tous présentés sous la forme ?. Seul le premier fichier/répertoire de ceux créés ci-dessus a réellement ? dans son nom. Nous pouvons le confirmer avec ls -b:

$ ls -lb
total 24
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å??\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\b\b\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\t\t\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:01 file\ å\n\n\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\v\v\ name.txt
drwxr-xr-x 2 terdon users 4096 Nov  8 13:02 file\ å\r\r\ name.txt

Donc, vous pouvez soit exécuter ls -b pour obtenir le nom de fichier correct, puis utiliser citation ANSI C pour le renommer:

mv å$'\r'$'\r' newname

Vous pouvez également utiliser un glob pour faire correspondre tous les fichiers/répertoires dont le nom commence par file å (. Remarque: cela ne fonctionnera que si avoir un) :

mv "file å*" newname

Ou, renommez tous les fichiers/répertoires dont le nom contient des caractères non alphanumériques (encore une fois, utile uniquement dans les cas où vous avez un seul cas):

shopt -s extglob  ## turn on extended globbing
mv !(*([[:graph:]])) newname

L'étrange !(*([[:graph:]])) a besoin d'explications. extglob active la lecture étendue étendue, ce qui nous permet d'utiliser !(foo) pour faire correspondre "not foo". La classe de caractères [[:graph:]] correspond à tous les caractères imprimables (pas les tabulations, les nouvelles lignes, etc.). Par conséquent, la correspondance négative !(*([[:graph:]])) fera correspondre tous les fichiers/noms avec des caractères non imprimables.

Si vous devez traiter plus d'un cas de ce type, utilisez une boucle. Quelque chose comme:

for dir in !(*([[:graph:]])); do 
     mv "$dir" "${dir//[^[:graph:]]/_}"; 
done

${dir//[^[:graph:]]/_} est le nom du répertoire avec tous les caractères non imprimables remplacés par _. Le problème avec cette approche est que vous pouvez avoir différents répertoires sources qui se retrouveront sous le même nom (par exemple, foo\n et foo\t deviendront tous deux foo_). Si cela pose un problème, il suffit de renommer à l'aide d'un compteur également:

a=0; for dir in !(*([[:graph:]])); do 
    ((a++)); 
     mv "$dir" "${dir//[^[:graph:]]/_}$a"
done

Cela se traduirait par:

drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt1
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt2
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt3
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å??_name.txt4
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt5
drwxr-xr-x 2 terdon users 4096 Nov  8 13:08 file_å___name.txt6
5
terdon

Autant que je sache, vous souhaitez renommer un fichier ou un dossier contenant des caractères non anglais à l'aide de terminal.

Pour cela, vous pouvez utiliser

mv x y

Où x est le nom du fichier/dossier que vous voulez renommer et y est le nouveau nom que vous voulez lui donner.

S'il contient des caractères non anglais et/ou des espaces, utilisez ' ' pour spécifier les limites de x et y. Voici un exemple:

mv 'öld namé öf fileş' 'néw namé öf fileş'

S'il vous plaît corrigez-moi si j'ai mal compris votre question.

0
SarpSTA

Vous avez clairement tenté d’échapper et de citer, vous pouvez également utiliser des caractères génériques avec des noms de fichiers gênants, par exemple,

$ ls *name\ 2008\ .txt    <==== make sure you only get the one file

$ mv *name\ 2008\ .txt  my_new_name.txt

Si cela ne répond pas à vos besoins, faites-le moi savoir - il existe d'autres approches utilisant le non-globbing.

0
uDude