web-dev-qa-db-ja.com

フォルダー内のファイルの一括名前変更のためのシェル/バッシュショートカット

正規表現またはその他の基準に基づいて、フォルダー内のすべてのファイルの名前を変更できるショートカットがShell/Bashにあります。ここで探しているのはフォルダドキュメントです。つまり、次の命名規則を持つ100個のテキストファイルがあるとします。

<longdocumentidentifier>-doc-<counter>.txt.

上記の規則に従って、すべてのファイルの名前を次のように変更する必要があります。

doc-<counter>.txt

上記に役立つワンライナーはありますか?

50
sc_ray

私は次のようなものを提案します:

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}フォームを使用する必要があります。

詳細については、 http://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1 を参照してください

96
Sorin

renameがある場合、rename 's/^.*-doc-/doc-/' *.txtトリックを行う必要があります。

21
telenachos

REGEXを使用できるprenameがあります。

prename 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

オプション-nを使用してシミュレートします。

prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/'  *.txt

注:これは、多くのLinuxディストリビューションでrenameとして出荷されますが、すべてではないため、Perlに付属するユーティリティの正規名を使用しています。

12
Elias Dorneles

ほとんどのLinuxに組み込まれているrenameコマンドは、たとえば、これを簡単に行います。

個人的には、正規表現も好むので、非常に長い間このスクリプトを持ち歩いてきました(80年代後半または90年代前半以降)。

#!/usr/bin/Perl

($op = shift) || die "Usage: $0 expr [files]]\n";

if(!@ARGV)
  {
  @ARGV = <STDIN>;
  chop(@ARGV);
  }

for (@ARGV)
  {
  $was = $_;
  eval $op;
  die $@ if $@;

  if ($was ne $_)
    {
    print "rename($was,$_)\n";
    rename($was,$_);
    }
  }

インストールすると、次のようなことができます:

script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt
8
Wes Hardaker

サブディレクトリに再帰する場合は、次もあります。

find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv

拡張正規表現を自動的にサポートするシステムでは、-E

利点:

  • サブディレクトリへの再帰
  • 再帰の最大深度を制御できます
  • ファイルやディレクトリの名前を変更できます(-type f | d)

短所:

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

here から修正された回答)

5
Ron Wertlen
mmv "*-doc-*" "doc-#2"

mmvコマンドは「質量移動」の略です

4
Ahmed

外部ツールを気にしないのであれば、ここにあります: rnmweb page

特定の問題の場合、コマンドは次のようになります。

rnm -rs '/.*-doc-/doc-/' *.txt

または

rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt

他の例/ドキュメントを見つけることができます こちら

3
Jahid

見つける。 -name '* scss' | xargs -L1 -I {} echo {} {} | sed 's/css.scss $/scss /' | xargs -L1 mv

たとえば、「。css.scss」で終わるファイルの束があり、単に「.scss」で終わるように名前を変更する場合(つまり、.css部分を削除する場合)

正規表現を微調整し、ニーズへの引数を見つけます

0
John M Naglick