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
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
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.
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.