GNU/Linux >> Linux の 問題 >  >> Linux

フォルダー内のファイルの名前を一括で変更するためのシェル/Bash ショートカット

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)

短所:

  • ファイル名を取得するためにパスを削除する必要があるため、やや複雑な正規表現

(ここから回答を修正)


Linux
  1. 最も古いファイルを移動するためのシェルスクリプト?

  2. グロブのBashでの設定、*がドットファイルと一致するかどうかを制御するには?

  3. Scp用のシェルが必要ですか?

  1. Linux シェル スクリプト用の 12 の Bash for ループの例

  2. BASH シェルが Linux で構成ファイルをロードする方法

  3. 複雑なテキスト ファイルでシェル変数を置き換える方法

  1. システム管理者の仕事でお気に入りのシェルは何ですか?

  2. 新しいファイルのフォルダを監視するスクリプト?

  3. フォルダー内のすべてのファイル内の文字列のすべての出現をカウントする