名前変更コマンドは、複数のファイルを削除するようです。復元できますか?

名前変更コマンドは、複数のファイルを削除するようです。復元できますか?

Ubuntu 22.04を使う

複数のファイルを含むフォルダがありますが、ファイル拡張子を変更したいので、次のようにしました。

rename 's/\.zip$/\.cbz/' *.zip

エラーなしでコマンドは完了しましたが、ファイルの3分の2が欠落していることがわかりました。これは角かっこや引用符を含むいくつかのファイルの名前に関連していると考えられていますが、欠落しているファイルの中には非常に単純な名前(comic5.zip)があることがわかり、名前が角かっこで始まるすべてのファイルが見つからないことがわかりました。

photorecを使用してこのファイルを回復しようとしましたが、そのうちの1つが見つかりませんでした。

今はフォルダサイズがはるかに小さくなって削除されたように見えますが、もしそうなら、photorecでは少なくとも一部は回復できないかと思います。私のファイルエクスプローラのみを使用すると、フォルダはコマンドを実行する前に約120 GB、実行後約40 GBでした。残念ながら、コマンドの前に実際のファイル数を見ることはできませんでしたが、スクロールするとファイル数がはるかに少ないことがわかりました。

このファイルに何が起こったのか、回復できるのかを知っている人はいますか?

$ rename -V
/usr/bin/rename using File::Rename version 1.30, File::Rename::Options version 1.10

修正する:

知っていると、photorecのいくつかの以前の設定を変更するのを忘れていました。再実行して欠落しているファイルが見つかりましたが、すべてのファイルが復元されたことがわかります。私はこれがファイルが実際に削除されたことを確認すると思います。まだ何が起こったのかは不明ですが、スティーブンの説明が最も可能性が高いと思います。

とにかく、助けてくれてありがとう。

答え1

実行するコマンドを検討してください。

rename 's/\.zip$/\.cbz/' *.zip

これは、globパターンに一致する現在のディレクトリ内のすべてのファイルまたはディレクトリ名最後の4文字をからに変更します。それはすべてです。 Perl 置換式を使用して名前を変更します。*.zip.zip.cbz

また、少なくとも私のシステムでは、ターゲットrename名がすでに存在するプロジェクト(ファイル)の名前を変更することは拒否されます。

touch a.zip a.zap
rename 's/\.zip$/.zap/' *.zip
a.zip not renamed: a.zap already exists

ファイルの約3分の2が欠落していることがわかりました。

あなたが説明する状況では、ファイル(またはディレクトリなど)が消える合理的な+状況は見えません。mvたとえば、上書きする前に完全性チェックを実行しない他のコマンドがあるかもしれません。あなたのことを確認しhistory、それが何を示すかを確認してください


*実際には、通常のファイル、ディレクトリ、デバイス、パイプなど、あらゆる種類のアイテム名を変更します。しかし、私が説明した条件を満たしている場合にのみ可能です。

+ダッシュ(-)またはダブルダッシュ(--)で始まるファイルは常に問題になります。別々の別々のコマンド引数とファイル引数を使用するか、通常の形式ではなく変更され--た形式を使用してファイルモードを保護しない限り、ここでも同様です。たとえば、名前を。./namenamemv -- -a dasha-adash

答え2

$ touch {comic5,{a..d}}.zip './--e=BEGIN{unlink for <c*>}#.zip'
$ ls
 a.zip   b.zip   comic5.zip   c.zip   d.zip  '--e=BEGIN{unlink for <c*>}#.zip'
$ rename 's/\.zip$/\.cbz/' *.zip
$ ls
 a.zip   b.zip   d.zip  '--e=BEGIN{unlink for <c*>}#.zip'

こんな!名前で始まるすべてのファイルがc削除されました。

File::Rename実装のために、renameこれらの質問は次のとおりです。1.99に固定(私の要求に応じて)しかし、Ubuntu 22.04にはバージョン1.30が付属しています。

ここであなたは以下が欲しいでしょう:

rename 's/\.zip\z/\.cbz/' ./*.zip

この./プレフィックスを使用すると、zipファイル名をオプションとして使用することはできませんrename

あるいは、特定の実装では、rename引数の代わりに標準入力を介してファイルのリストを渡します。

printf '%s\0' *.zip | rename -0 's/\.zip/\.cbz/'

シェルに組み込まprintfれている機能(ほとんど)も次のように機能します。Argument list too long限界。

またはそのような問題がなく、いくつかの追加の保護があり、一般的に使いやすいものをzsh代わりに使用してください²:zmv

autoload -Uz zmv
zmv '(*).zip' '$1.cbz'

今、これは偶然起こったようではありません。これが発生すると、誰かがそのコマンドを実行することを知って、現在のディレクトリに似た名前の悪意のあるファイルを植えることができます。

マルウェアが存在する場合unlink()rename()または交換によってファイルが削除された場合は、次のものを使用できます。一部のファイルシステムの削除の取り消し/復元方法shred/と同じ操作を実行したり、wipeランサムウェアなどのファイルを別の場所に移動したりする前にコンテンツを暗号化する場合は、最適なオプションはバックアップから復元することです。

悪意のあるファイル名がない場合は、rename名前を変更する前にターゲットファイルが存在することを確認するため、通常はデータの損失はありません。これらのシンボリックリンクのターゲットにアクセスできないと、シンボリックリンクファイルが失われる可能性があります。rename使用-e <the-target>ユーティリティのように確認できないシンボリックリンクに対して-efalseを返します[

$ touch a.zip
$ ln -s /x a.bcz
$ ls -n
total 4
lrwxrwxrwx 1 1000 1000 2 Dec 22 08:39 a.bcz -> /x
-rw-r--r-- 1 1000 1000 0 Dec 22 08:39 a.zip
$ rename -v 's/\.zip$/\.bcz/' *.zip
a.zip renamed as a.bcz
$ ls -n
total 0
-rw-r--r-- 1 1000 1000 0 Dec 22 08:39 a.bcz

こんな! (壊れた)a.bczシンボリックリンクが消えました。

ただし、シンボリックリンクはディスク上の非常に小さなスペースを占めるため、これは現在経験している120GiB損失の80%を説明しません。

クリスのように、私もあなたの問題が別の場所にあると思います。あなたのファイルはまだそこにあるかもしれませんが、あなたが思うディレクトリにはないかもしれません。試してみてくださいsudo find / -iname 'comic5.zip' -o -iname 'comic5.cbz'


¹また、通常、正規\z表現$でinを使用して、以下を除くすべての項目と一致させたいことに注意してください。ワイヤー$トピックの終わり(ここで望むもの)またはトピックの終わりの改行の前(望ましくないがこの特別な場合は、トピックは改行ではなく.zip改行で終わるため)と一致します。それは問題にならないでしょう)。

mv²ファイルごとに1つずつ呼び出すため、通常は遅くなります。zmodload zsh/files組み込みmv

関連情報