find ....-execdirが見つからないファイルの名前を変更するのはなぜですか?扱いにくい

find ....-execdirが見つからないファイルの名前を変更するのはなぜですか?扱いにくい

MX Linux 23.2でzshを使用しています。

何年もの間、私はなぜ次のような命令が出てくるのかを理解しようとしてきました。

find . -depth -type f -execdir rename 's/_720p//' {} \;

ファイルをスキップします。

私のファイルマネージャが変更を表示しないことがわかったので、ls端末に入力して確認しました。望むより!名前に「_720p」を含むファイルがここにリストされています。

プロセスをバックグラウンドで送信してを使用してみましたが、wait同じ結果が得られました。私が見つけた唯一のものは次のとおりです。

while  [ ! .(NF) ]; do
filename=$(find . -type f -print0 -quit)
rename 's/_720p//' $filename
mv $filename $HOME/Videos
done

私はこれとリモートで似たような他の質問を見たことがありません。 Linuxの世界でこれを行うことができない人は私だけですか?問題は何ですか?

答え1

s/_720p//最初の項目のみが置き換えられるため、ファイル名_720pが 。foo_720p_bar_720pfoo_bar_720p

g次のすべてのエントリを置き換えるにはフラグを追加する必要がありますがs/_720p//g、exampleというファイルにはfoo_72_720p0p1つのエントリしかありませんが、_720pそのエントリが削除されると名前が変更されます。foo_720p

この場合、while (s/_720p//g) {}何も見つからないまで交換を再試行する必要があります。

また、一部のPerlベースrenameの実装では、-dファイルのデフォルト名でのみ機能することを選択できるため、rename各ファイルに対して1つずつ実行する必要はありません。

find . -depth -name '*_720p*' -type f -exec rename -d '
  while (s/_720p//g) {}' {} +

zsh一括名前変更は自動ロード機能に組み込まれていますzmv

autoload -Uz zmv
zmv '(**/)(*_720p*)(#q.)' '$1$2:gs/_720p//'

すべての項目が置き換えられます。ケース処理_72_72_720p0p0p:

zmv '(**/)(*_720p*)(#q.)' '$1$2:fs/_720p//'

f次のような状況を引き起こすすべてs 修飾子修正がないまで繰り返します。


1 ただし、セキュリティ改善の恩恵を受けることはありません-execdir。一部のfind実装ではこれをサポートしています{} +が、-execdirディレクトリごとに少なくとも1つを実行する必要がありますrename

関連情報