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

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

少し問題があります。ある顧客が非常に古いサーバーからサイトを移行してもらいました。彼らがどのようにそこに到着したのかわかりませんが'。ファイル名を変更する方法はありますか?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式の一部ではないためです) )。 。

おすすめ記事