Renommer un fichier qui a obtenu un guillemet 'dans son nom

11

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? mvne 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?

Igor Yavych
la source
1
Si vous avez des moreutils , vidirc'est une solution simple à ce genre de problèmes.
derobert

Réponses:

6

L'achèvement de l'onglet Bash devrait être en mesure de faire la bonne chose ici si vous tapez mv 90843_Oet appuyez sur tab. Sinon, une façon d'échapper correctement le nom est:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

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:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

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:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

Le -ifera l' mvinvite si des fichiers seront écrasés. Utilisation prename( renameliens vers ceci sur de nombreux systèmes):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Retirez-le -nlorsque 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).

Graeme
la source
4

Vous pouvez utiliser renamepour de telles tâches:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Si vous souhaitez remplacer 'pour _vous pouvez également utiliser renommer:

rename "s/\'/_/g" *
Braiam
la source
-2

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 -vest 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 filerenomme -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.jpgsi 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.

rautamiekka
la source
Pourquoi downvote? J'écrivais avant les autres mais je n'ai pas été assez rapide pour le publier en premier.
rautamiekka
Ce n'était pas moi. Aucune idée de qui a voté.
Igor Yavych
1
Cette réponse n'est pas correcte, elle ignore les barres obliques inverses dans le nom de fichier qui sont en fait plus difficiles à gérer que le guillemet simple.
Graeme