ファイルとディレクトリの名前を変更します 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
ので、ハッキングが必要とされる-execdir
1つの非常に迷惑な欠点がある: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 拡張機能です。rename
Perlベースで、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
ですか?