
複数のサブフォルダとファイルを含むディレクトリ構造では、一部のファイル名にはサフィックス_create
(たとえばjava1_create
)があり、一部のファイル名には_bak
(java2_bak
)があります。
すべてのファイルにサフィックスが付くように_create
ファイル名をサフィックスに変更するだけです。_bak
_bak
これを行うコマンドやスクリプトはありますか?
答え1
Linuxでは、_create
ファイル名に何もないと仮定すると(最後にのみ)、rename
すべての非組み込みLinuxシステムにインストールされているutil-linuxパッケージのユーティリティを使用できます。呼び出しは、find
サブディレクトリ内のすべてのファイルに対してコマンドを繰り返し実行します。
find -depth -exec rename _create _bak {} +
Debianおよび派生ディストリビューション(Ubuntu、Mintなど)では、Perlスクリプトはとして提供されるか、代わりにrename
呼び出されるか、または置き換えられます。rename.ul
rename
rename _create _bak
rename 's/_create$/_bak/'
答え2
これがあなたが求めているものかもしれません:
for file in $(find . -name "*_create"); do mv -i $file ${file%%_create}_bak; done
実際のファイルで使用する前に必ずテストしてください。
答え3
Debian、Ubuntu、およびその派生製品ではPerlが使用され、rename
時には次のようにインストールされますprename
。
#enable ** globbing
shopt -s globstar
#use the rename utility
rename -n 's/_create$/_bak/' **_create
期待どおりに動作したら-n
(=) フラグを削除します。--no-act
メモ:
これはおそらくこれを行う最も短く効率的な方法です。特にすでにshotp -s globstar
(mine ~/.bashrc
)を使用している場合はさらにそうです。
しかし、次のようになります。
-bash: /usr/bin/rename: Argument list too long
**_create
拡張子がgetconf ARG_MAX
文字長(Linuxシステムでは2097152)を超える場合。
find -print0
この場合、次のように使用する必要がありますxargs -0
(参照lcd047の答え)。