Linuxで再帰的にファイル名を変更(拡張子を変更)


22

ディレクトリ内のすべてのファイルの名前を再帰的に変更し、数千のサブフォルダー内の数千のファイルについて、あるファイル拡張子を別のファイル拡張子に変更するにはどうすればよいですか?私はほとんど私が望むことをするコマンドをたくさん見ますが、完全ではありません。

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile

1
Debian renameまたはRed Hatをお持ちrenameですか?
イグナシオバスケス-アブラムス

@Ignacio:Ubuntu = Debian?
エンドリス

はい、UbuntuはDebianの派生物です。
イグナシオバスケス-アブラムス

回答:


23

理解した

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

もちろん、実際に実行するときに-vを削除するか、すべてのファイルを表示するのに時間がかかります


14

何かのようなもの:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;

これは私にとって最高の働いていた
CWD


4

この方法の方が読みやすくなっていることがわかりました。

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

少なくともUbuntu派生では、コマンドラインに何もなければ、renameはSTDINからファイルのリストを取得します。そして、これは以下で簡単にテストできます:

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

あなたがそれを正しくするまで。


1

ファイルとディレクトリの名前を変更します find -execdir | rename

単に接尾辞を付けるのではなく、ファイルとディレクトリの両方の名前を変更する場合、これは良いパターンです。

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find . -depth -execdir rename 's/findme/replaceme/' '{}' \;

awesome -execdirオプションはcdrenameコマンドを実行する前に、ディレクトリとは異なり-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

-execdirPOSIXの GNU find 拡張機能です。renamePerlベースで、renameパッケージに由来します。Ubuntu 18.10。でテスト済み。

先読み回避策の名前を変更する

入力パスがから来ていないfind場合、または相対的なパスの煩わしさが十分にある場合、Perlの先読みを使用して、次のようにディレクトリの名前を安全に変更できます。

git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'

私はのために便利なアナログ発見していない-execdirxargsxargsのを:変更を実行する前に、ファイルパスにディレクトリを作業しますか?

sort -r長いパスが同じプレフィックスを持つ短いものの後に来るので、ファイルは、それぞれのディレクトリの後に来ることを保証するために必要とされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.