名前に引用符 'が付いたファイルの名前を変更しています


11

少し問題が発生しました。あるクライアントから、本当に古いサーバーからのサイトの移行を依頼されました。彼らがどうやってそこに着いたのか分からないが'、彼らの名前の中にファイルがある。ファイルの名前を変更する方法はありますか?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:stat '90843_O \' ConnorPaul_GeneralManager.jpg 'はできません:そのようなファイルまたはディレクトリはありません

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


1
moreutilsを使用している場合、これvidirはこの種の問題に対する簡単な解決策です。
derobert 14

回答:


6

入力してTabキーmv 90843_Oを押すだけで、Bashタブ補完はここで正しいことを実行できるはずです。それ以外の場合、名前を適切にエスケープする1つの方法は次のとおりです。

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

二重引用符を使用すると、をエスケープする必要がなくなり'ますが、2つのバックスラッシュ文字をエスケープする必要があります(バックスラッシュを1つ追加すると4つのバックスラッシュになります)。別のオプションは次のとおりです。

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

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

ここでの問題は、単一引用符と同じように名前にバックスラッシュを含めることと同じです。交換するには、\\'ループを使用してディレクトリ内のすべてのファイルのためのアンダースコアで(2つのバックスラッシュは、問題のファイル名であるので、両方の問題が発生します)シーケンスを:

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

-iようになりますmvいずれかのファイルが上書きされます場合は、プロンプト。使用prenamerename多くのシステムでこれへのリンク):

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

-nそれがあなたがしたいことをやっていることが幸せであるとき、それを削除してください。バックスラッシュ文字は、単一引用符で囲まれていても、ここではperl式内でエスケープする必要があることに注意してください(単一引用符がないと、4つのスラッシュがシェルによって削除され、perl式の一部ではなくなるため、8つのバックスラッシュが必要になります)。


4

この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" *

-2

Grrr、@ Graemeは私を倒しましたが、とにかく投稿します...

のようmv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpgに二重引用符でファイル名を引用すると、それでうまくいきます。使用-vはオプションですが、それは何をしたかを教えてくれます。すべての文字をエスケープすることとは別に、別の方法もあると思います。この方法について私が知っている唯一の欠点は、シェルがテキストを処理することです。これは単一引用符の内側にないためですが、内部コードではないためまったく処理されず、処理にかかる余分な時間は無意味です。

テストしたばかり>で、二重引用符で囲まれたテキスト内にcharのようにすることができ、ファイル名の一部として解釈されます。

将来のためのヒントとして、あなたは使用することができ./、それがダッシュで始まるファイルと同じように、問題を与えた場合、ファイル名の前に右:mv ./-file file名前が変更されます-filefile。このような場合、例外としてファイル名を引用したりエスケープしたりすることはできません。

奇妙なことに90843_O'ConnorPaul_GeneralManager.jpg、で単一引用符をエスケープした場合はファイルを作成できました\'が、二重引用符またはエスケープしなかった場合は作成できませんでした。

PS:Bash補完は別の方法です。ファイルのファイル名の問題を回避しますが、「ダッシュ」ファイル/フォルダーでは機能しません。名前の一部を書き込み、Tabキーを押すだけで、残りは実行されます。


なぜ反対票を投じるのですか?他の人の前に書いていましたが、最初に投稿するのに十分な速さではありませんでした。
rautamiekka 14

私じゃなかった。反対票を投じた手がかりはありません。
Igor Yavych

1
この答えは正しくありません。単一引用符よりも実際に処理するのが難しいファイル名のバックスラッシュを無視します。
Graeme 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.