
私のディレクトリツリーは次のようになります -
/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/What
ため失敗します。What
を使用してrename
ファイル名のみを処理すると、-d
この問題は修正されます。
find . -depth | rename -d 's/[?<>\\:*|\"]//g'
のバージョンがオプションrename
をサポートしていない場合-d
( のバージョン 1.10 で導入されFile::Rename
、Perl バージョンであると想定)、各ディレクトリ内で を実行することによってのみファイル名を渡すようにするrename
ことができます。find
rename
find . -depth -execdir rename 's/[?<>\\:*|\"]//g' {} +