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_720p
foo_bar_720p
g
次のすべてのエントリを置き換えるにはフラグを追加する必要がありますがs/_720p//g
、exampleというファイルにはfoo_72_720p0p
1つのエントリしかありませんが、_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
。