正規表現またはその他の基準に基づいて、フォルダー内のすべてのファイルの名前を変更できるショートカットがShell/Bashにあります。ここで探しているのはフォルダドキュメントです。つまり、次の命名規則を持つ100個のテキストファイルがあるとします。
<longdocumentidentifier>-doc-<counter>.txt.
上記の規則に従って、すべてのファイルの名前を次のように変更する必要があります。
doc-<counter>.txt
上記に役立つワンライナーはありますか?
私は次のようなものを提案します:
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 を参照してください
rename
がある場合、rename 's/^.*-doc-/doc-/' *.txt
トリックを行う必要があります。
REGEXを使用できるprename
があります。
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
オプション-n
を使用してシミュレートします。
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
注:これは、多くのLinuxディストリビューションでrename
として出荷されますが、すべてではないため、Perlに付属するユーティリティの正規名を使用しています。
ほとんどの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
サブディレクトリに再帰する場合は、次もあります。
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
拡張正規表現を自動的にサポートするシステムでは、-E
。
利点:
短所:
( here から修正された回答)
mmv "*-doc-*" "doc-#2"
mmvコマンドは「質量移動」の略です
見つける。 -name '* scss' | xargs -L1 -I {} echo {} {} | sed 's/css.scss $/scss /' | xargs -L1 mv
たとえば、「。css.scss」で終わるファイルの束があり、単に「.scss」で終わるように名前を変更する場合(つまり、.css部分を削除する場合)
正規表現を微調整し、ニーズへの引数を見つけます