その中には多くのサブディレクトリがあり、そこには多くの拡張機能があるディレクトリがあります.no_sub
。
.no_sub
拡張子を持つすべてのファイルの名前を同じ名前に変更して.no_sub
削除したいと思います。
だからfoo.no_sub
- > foo
。
Bashでこれを行うことはできますか? (私はUbuntu 20.04を使用しています)
ベストアンサー1
標準find
、sh
およびmv
:を使用してください。
find . -type f -name '*.no_sub' -exec sh -c '
for pathname do
mv -- "$pathname" "${pathname%.no_sub}"
done' sh {} +
.no_sub
名前が文字列で終わる現在のディレクトリ内または下の一般的なファイルを探します。これらのパス名のバッチに対して短いインラインシェルスクリプトが呼び出されます。このsh -c
スクリプトは、指定されたパス名の配置を繰り返し、ファイル名のサフィックスを削除してそれぞれの名前を変更します.no_sub
。ファイル名サフィックスの削除は、${variable%suffix}
標準パラメータ拡張を使用して行われます。
ファイル名の競合は解決されません。
これは似たような到着Marcus Müllerが提供するソリューション個々のファイルの名前の変更は、同じ方法で行われますが、find
隠された名前を選択し、通常のファイルに対してのみ繰り返す明示的なファイルタイプフィルタを含む方法でパス名のループリストを生成するために使用されます。
また見なさい:「find」の-execオプションについて
インラインスクリプトに与えられたすべてのファイル名は次に終わることを知っています.no_sub
。.no_sub
find . -type f -name '*.no_sub' -exec sh -c '
for pathname do
mv -- "$pathname" "${pathname%.*}"
done' sh {} +