名前に引用符を含むファイルの名前を変更する

名前に引用符を含むファイルの名前を変更する

少し問題があります。ある顧客が非常に古いサーバーからサイトを移行してもらいました。彼らがどのようにそこに到着したのかわかりませんが'。ファイル名を変更する方法はありますか?mvこれは完了していないようです。

ls次のように表示されます90843_O\\'ConnorPaul_GeneralManager.jpg

私が試したとき

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

>追加の入力を待つように、新しい行は何もしません。

試してみると

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

エラーが発生しました。

mv: '90843_O\'ConnorPaul_GeneralManager.jpg' を統計できません。そのファイルやディレクトリはありません。

\'また、特定のフォルダ内のすべてのファイルを簡単に変更する方法はありますか_

答え1

mv 90843_OTabキーを入力して押すと、Bashタブの完成がここで正しい操作を実行する必要があります。それ以外の場合、名前を適切にエスケープする1つの方法は次のとおりです。

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

二重引用符を使用するとエスケープする必要はありませんが、'2つのバックスラッシュ文字はまだエスケープする必要があります(各バックスラッシュ文字は4つのバックスラッシュを形成します)。別のオプションは次のとおりです。

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

ここでバックスラッシュを一重引用符で囲むとバックスラッシュをエスケープする必要はありませんが、リテラルを追加するには一重引用符を終了する必要があります'。これは、閉じる引用符の後にエスケープされます。

ここでの問題は名前のバックスラッシュと一重引用符にあります。ループを使用してディレクトリ内のすべてのファイルの順序を\\'下線に変更するには(質問のファイル名に2つのバックスラッシュがあるため、両方が問題を引き起こす可能性があります):

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

ファイルを上書きするかどうかを尋ねるメッセージが表示されます-imv使用prenamerename多くのシステムでこれへのリンク):

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

-n必要に応じて機能しているという事実に満足している場合は、削除してください。バックスラッシュ文字は、周囲に一重引用符がある場合でも、ここではperl式内でエスケープする必要があります(一重引用符がない場合は8つのバックスラッシュが必要です。4つのバックスラッシュはシェルによって削除され、perl式の一部ではないためです) )。 。

答え2

rename次の作業に使用できます。

➜  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

変更するには、名前の変更も'使用_できます。

rename "s/\'/_/g" *

答え3

Grrr、@Graemeが私に勝ったが、とにかく投稿します…

たとえば、ファイル名を二重引用符で囲むとmv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpg機能します。 usingは-vオプションですが、その内容を教えてくれます。可能であれば、すべての文字をエスケープする以外に2番目の方法があると思います。この方法について私が知っている唯一の欠点は、一重引用符内にないため、シェルはテキストを処理しますが、内部コードではなく、処理に必要な追加時間が無意味であるため、テキストをまったく操作しないことです。

>テストしたばかりの場合は、二重引用符で囲まれたテキストにcharを使用できます。これはファイル名の一部として扱われます。

今後のヒントとして、./問題が発生した場合はファイル名の前に使用できます。たとえば、ダッシュ:で始まるファイル名はにmv ./-file file変更されます。この場合、例外的にファイル名を引用またはエスケープすることはできません。-filefile

奇妙なことは、90843_O'ConnorPaul_GeneralManager.jpg一重引用符をエスケープするとファイルを作成できますが、\'二重引用符ではないか、エスケープするとファイルが生成されないことです。

PS:Bashの完成はもう一つの方法です。ファイルのファイル名の問題を解決しますが、「ダッシュ」ファイル/フォルダでは機能しません。名前の一部を書き、Tabキーを押すと、残りの操作が実行されます。

関連情報