親ディレクトリの名前を変更するときは、サブディレクトリの名前を変更しないでください。

親ディレクトリの名前を変更するときは、サブディレクトリの名前を変更しないでください。

私のディレクトリツリーは次のとおりです -

/media/blueray/Data/Test$ tree
.
├── What????
│   └── What????
└── What????.txt

私がコマンドを実行するとfind . -depth | rename 's/[?<>\\:*|\"]//g'

それは言う -

Can't rename ./What????/What???? ./What/What: No such file or directory

ただし、コマンドを実行した後のディレクトリ構造は ——

/media/blueray/Data/Test$ tree
.
├── What
│   └── What????
└── What.txt

find私はビューにはツリーの上から検索を開始するため、ツリーを追跡できないようです。

ここで解決策は何ですか?

答え1

問題はフルパスを処理しているため、名前を変更しようとしfindますが、ディレクトリが(まだ存在しないため)失敗します。rename./What????/What????./What/WhatWhat

renameを使用してファイル名を処理すると、-d問題が解決します。

find . -depth | rename -d 's/[?<>\\:*|\"]//g'

バージョンがrenameこのオプションをサポートしていない場合(Perlバージョンがあると仮定してバージョン-d1.10で導入されている場合)、各ディレクトリで実行するまでファイル名を渡すことができます。File::Renamerenamefindrename

find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +

(ありがとうございます。フレディ~のため解決策.)

関連情報