ファイルとディレクトリの名前を変更します find -execdir | rename
単に接尾辞を付けるのではなく、ファイルとディレクトリの両方の名前を変更する場合、これは良いパターンです。
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
awesome -execdirオプションはcd、renameコマンドを実行する前に、ディレクトリとは異なり-execます。
-depth 親ディレクトリの欠落に伴う潜在的な問題を防ぐために、最初に子、次に親で名前変更が行われることを確認してください。
-execdir 名前変更はベース名以外の入力パスではうまく機能しないため、たとえば次のように失敗します。
rename 's/findme/replaceme/g' acc/acc
PATHので、ハッキングが必要とされる-execdir1つの非常に迷惑な欠点がある:find非常に独断とで何かをすることを拒否されて-execdir、あなたの内の相対パスがある場合PATHなど、環境変数を./node_modules/.binして失敗し、:
find:相対パス './node_modules/.bin'はPATH環境変数に含まれています。これは、findの-execdirアクションと組み合わせた場合、安全ではありません。そのエントリを$ PATHから削除してください
参照:https : //askubuntu.com/questions/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdirはPOSIXの GNU find 拡張機能です。renamePerlベースで、renameパッケージに由来します。Ubuntu 18.10。でテスト済み。
先読み回避策の名前を変更する
入力パスがから来ていないfind場合、または相対的なパスの煩わしさが十分にある場合、Perlの先読みを使用して、次のようにディレクトリの名前を安全に変更できます。
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
私はのために便利なアナログ発見していない-execdirとxargs:xargsのを:変更を実行する前に、ファイルパスにディレクトリを作業しますか?
sort -r長いパスが同じプレフィックスを持つ短いものの後に来るので、ファイルは、それぞれのディレクトリの後に来ることを保証するために必要とされます。
renameまたはRed Hatをお持ちrenameですか?