prename
があります 、これにより、REGEX を使用できます:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
オプション -n
を使用します シミュレートする:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
注: これは rename
として出荷されます 多くの Linux ディストリビューションに含まれていますが、すべてではありません。そのため、Perl に付属しているユーティリティの正規名を使用しています。
次のようなものをお勧めします:
for i in *-doc-*.txt; do mv "$i" "${i/*-doc-/doc-}"; done
${i/*-doc-/doc-}
最初に出現した *-doc-
を置き換えます doc-
で .
複数の置換を行う必要がある場合 (コメント番号 1 を参照)、${var//Pattern/Replacement}
を使用する必要があります。 変異体。名前の先頭を置き換える必要がある場合は、 ${var/#Pattern/Replacement}
を使用する必要があります 、末尾 (拡張子) を置き換える必要がある場合は、 ${var/%Pattern/Replacement}
を使用する必要があります 形。
詳細については、シェル パラメータの展開を参照してください。この展開は bash 固有です。
rename
がある場合 次に、rename 's/^.*-doc-/doc-/' *.txt
トリックを行う必要があります。
サブディレクトリに再帰したい場合は、次のものもあります:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
拡張正規表現を自動的にサポートするシステムでは、-E
を省略できます .
利点:
- サブディレクトリへの再帰
- 再帰の最大深度を制御できます
- ファイルやディレクトリの名前を変更できます (-type f|d)
短所:
- ファイル名を取得するためにパスを削除する必要があるため、やや複雑な正規表現
(ここから回答を修正)