J'ai un petit problème. Un client m'a chargé de la migration de sites à partir d'un serveur vraiment ancien. Je ne sais pas comment ils y sont arrivés, mais il y a des fichiers avec '
leur nom. Existe-t-il un moyen de renommer le fichier? mv
ne semble pas faire l'affaire.
ls
le montre comme 90843_O\\'ConnorPaul_GeneralManager.jpg
Quand j'essaye
mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
il ne fait rien avec le >
dans la nouvelle ligne comme s'il attendait plus de saisie.
Si j'essaye
mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg
Je reçois l'erreur
mv: ne peut pas stat '90843_O \' ConnorPaul_GeneralManager.jpg ': Aucun fichier ou répertoire de ce type
De plus, existe-t-il un moyen simple de passer \'
à _
tous les fichiers d'un certain dossier?
vidir
c'est une solution simple à ce genre de problèmes.Réponses:
L'achèvement de l'onglet Bash devrait être en mesure de faire la bonne chose ici si vous tapez
mv 90843_O
et appuyez sur tab. Sinon, une façon d'échapper correctement le nom est:Les guillemets doubles suppriment la nécessité d'échapper à la
'
, mais les deux caractères de barre oblique inverse doivent toujours être échappés (une barre oblique inverse supplémentaire pour chacun fait quatre barres obliques inverses). Une autre option est:Ici, mettre les barres obliques inverses entre guillemets supprime la nécessité de les échapper, mais vous devez mettre fin aux guillemets simples pour ajouter un littéral
'
. Ceci est échappé après la fin des guillemets.Notez que le problème ici est autant lié à la présence de barres obliques inversées dans le nom qu'à la citation unique. Pour remplacer la
\\'
séquence (puisqu'il y a deux barres obliques inverses dans le nom de fichier dans la question, les deux causeront des problèmes) avec un trait de soulignement pour tous les fichiers d'un répertoire utilisant une boucle:Le
-i
fera l'mv
invite si des fichiers seront écrasés. Utilisationprename
(rename
liens vers ceci sur de nombreux systèmes):Retirez-le
-n
lorsque vous êtes satisfait qu'il fait ce que vous voulez. Notez que les caractères de barre oblique inverse doivent être échappés à l'intérieur de l'expression perl ici, même s'il y a des guillemets simples autour d'eux (sans les guillemets simples, vous auriez besoin de huit barres obliques inverses car quatre seraient supprimées par le shell et ne feraient pas partie de l'expression perl).la source
Vous pouvez utiliser
rename
pour de telles tâches:Si vous souhaitez remplacer
'
pour_
vous pouvez également utiliser renommer:la source
Grrr, @Graeme m'a battu, mais je posterai quand même ...
Si vous citez le nom de fichier avec des guillemets doubles, comme
mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg
, il fait l'affaire; l'utilisation-v
est facultative mais elle dira ce qu'elle a fait. Je pense qu'il y a une deuxième façon de s'échapper de tous les caractères, si c'est possible. Le seul inconvénient que je connaisse de cette façon est que le shell traitera le texte car il n'est pas entre guillemets simples, mais il ne le manipule pas du tout car ce n'est pas du code interne, et le temps supplémentaire qu'il faut pour traiter n'a pas de sens.Juste testé, vous pouvez avoir char comme
>
dans un texte entre guillemets et il sera considéré comme faisant partie du nom de fichier.En tant que conseil pour l'avenir, vous pouvez utiliser
./
juste avant le nom de fichier si elle donne des problèmes, comme les fichiers commençant par un tiret:mv ./-file file
renomme-file
àfile
. Dans ce cas, vous ne pouvez pas citer ni échapper le nom de fichier, à titre d'exception.Curieusement, je pourrais créer le fichier
90843_O'ConnorPaul_GeneralManager.jpg
si j'échappais à la citation simple\'
, mais il ne le créerait pas s'il n'était pas entre guillemets doubles ou échappé.PS: la complétion de Bash est une autre façon, cela a fonctionné autour du problème de nom de fichier avec votre fichier, mais cela ne fonctionnera pas avec les fichiers / dossiers "dash": écrivez simplement une partie du nom et appuyez sur Tab, il fait le reste.
la source