Linuxでのファイルのシーケンス番号の変更


0

以下のように一連のファイルの名前を変更するスクリプトを作成することは可能ですか?

  • sol-temp_0010.pngsol-temp_1.png
  • sol-temp_0015.pngsol-temp_2.png
  • sol-temp_0020.pngsol-temp_3.png

等。?


1
何を試しましたか?私たちはスクリプト作成サービスではなく、人々が事前に何らかの作業を行うことを期待しています。いくつかを新しいフォルダにコピーして、何か問題が発生した場合、問題が発生した場合は、動作するものを作成してみてください。
nerdwaller

基本的なbash解決策が必要です:forループの使用方法、ファイル名のワイルドカード、整数変数の宣言と使用、およびmvコマンド。今までに何を試しましたか?
ダニエルベック

mmvを試しましたか?
cfreire

回答:


1

rename:コマンドは、Perl(したがって、多くのLinuxディストリビューションで、あまりにも)簡単に十分にこれを行うことができますに含まれています

rename 's%(\d+)%$1/5-1%e' sol-temp_*.png

単一引用符で囲まれた文字列はPerlコードとして評価され、各ファイル名を変更するために使用されます。

具体的にs%foo%bar%は、正規表現の一致と置換演算子です。(通常はとして記述s/foo/bar/しますが、置換にスラッシュを使用したかったため、別の区切り文字を選択しました。)正規表現(\d+)は、ファイル名の1つ以上の数字の最初のシーケンスと一致$1し、置換。e最後のスイッチにより、置換$1/5-1はPerlコードとして評価されるため$1、10 で割った値から1を引いた値を返します。

renameコマンドがインストールされていない場合(またはrename動作が異なる場合、その名前を使用するUnixコマンドがいくつかあります)、Perlを使用している場合、次のようなほぼ同じ効果が得られます。

perl -e 'for (<sol-temp_*.png>) {$o = $_; s%(\d+)%$1/5-1%e; rename $o, $_}'

ただし、このバージョンにはエラーチェックやファイルの上書きに対する保護機能がないことに注意してください。これらを追加するのはそれほど難しくありませんが、1行ではコードが少し長すぎます。ただし、完全なスクリプトを作成してもかまわない場合は、次のようなものが機能するはずです。

#!/usr/bin/perl
use strict;
use warnings;

foreach my $name (<sol-temp_*.png>) {
    my $orig = $name;

    $name =~ s%(\d+)%$1/5-1%e;   # map "0010" -> "1", "0015" -> "2", etc.

    next if $name eq $orig;
    warn "$0: $name exists, not renaming $orig\n" and next if -e $name;
    rename $orig, $name or warn "$0: error renaming $orig to $name: $!\n";
}

(上記のスクリプトを簡単に変更して、コマンドラインから置換コードとファイル名を読み取ることさえできますが、スクリプトが実行する行だけですrenameが、それはこの答えの範囲を超えています。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.