特定の拡張子を持つすべてのファイルから拡張子を繰り返し削除します。

特定の拡張子を持つすべてのファイルから拡張子を繰り返し削除します。

その中には多くのサブディレクトリがあり、そこには多くの拡張機能があるディレクトリがあります.no_sub

.no_sub拡張子を持つすべてのファイルの名前を同じ名前に変更して.no_sub削除したいと思います。

だからfoo.no_sub- > foo

Bashでこれを行うことはできますか? (私はUbuntu 20.04を使用しています)

ベストアンサー1

標準findshおよび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 {} +

おすすめ記事