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)
短所:
- ファイル名を取得するためにパスを削除する必要があるため、やや複雑な正規表現
(ここから回答を修正)