Perlスクリプトを使用してLinuxでファイル名を変更する

Perlスクリプトを使用してLinuxでファイル名を変更する

Linuxシステムには「pre_」のような接頭辞付きのファイルセットがあり、それを削除してすべてのファイルの名前を変更したいと思います。これは私が書いたPerlコードです。エラーは発生しませんが、操作はまだ完了していません。

#!/usr/bin/perl -w
my @files = `ls -1 | grep -i \"pre_.*\"`;
foreach $file ( @files )
{
  my @names = split(/pre_/, $file);
  my $var1 = $names[1];
  'mv "$file" "$var1"';
}

ベストアンサー1

あなたは何も実行しません。一重引用符()内に何かを入れると、''これは単なる文字列なので、'mv "$file" "$var1"'コマンドではなく文字列であり、何もしません。文字列自体は真の記述です。このコマンドを実行するには、以下を使用する必要があります。

system "mv", "--", $file, $var1;

いいえ system("mv '$file' '$var1'")これによりコマンドインジェクションの脆弱性が発生します。)

しかし、必ずしもそうする必要はありません。次perlの機能をrename()使用できます。

rename($file, $var1)

次に、実際に解析してはならない出力は次lsのようになります。とても悪い考えで壊れやすいです。。また、Perl(または他のプログラミング言語)ではまったく必要ありません。その文字列を含む現在のディレクトリ内のすべてのファイルを一致させるにはpre_(これはすぐにgrep行うことです。必要はありませんが、grepこれを使用するだけですls -d -- *pre_*)、次のことができますglob()

my @files = glob("*pre_*");

したがって、これらすべてを総合すると次のようになります。

#!/usr/bin/perl -w
use File::Glob qw(:globally :nocase);
my @files = glob("*pre_*");
foreach $file ( @files )
{
  my @names = split(/pre_/i, $file);
  rename($file, $names[1]);
}

しかし、それは本当に良い考えではありません。同じプレフィックス(たとえば、pre_file1およびapre_file1)を持つ2つのファイルがある場合、最初のファイルは2番目のファイルで上書きされます。この例では、file1コマンドはpre_その前のすべてのエントリを削除するため、両方のファイルの名前が変更されます。したがって、警告を追加して次のファイルをスキップできます。

#!/usr/bin/perl -w
use File::Glob qw(:globally :nocase);

my @files = glob("*pre_*");
foreach $file ( @files )
{
  my @names = split(/pre_/i, $file);
  if (-e $names[1]) {
    warn "Warning: Not renaming '$file' to '$names[1]' " .
        "because '$names[1]' exists.\n";
    next;
  }
  rename($file, $names[1]) or
    warn "rename '$file': $!\n";
}

もちろん、これはすべての車輪を再発明することです。直接インストールしてからperl-rename(Debian、Ubuntuなどで実行する、他のシステムでは、またはapt install rename)、次のことができます(大文字と小文字を区別しませんが、含まれているファイルのみを探します)。prenameperl-renamepre_

rename -n 's/.*?pre_//si' ./*

実際の名前を変更せずに実行するジョブのみを印刷します-nrename名前の変更が期待どおりに機能すると確信している場合は、-n実際にファイル名を変更せずにコマンドを再実行してください。

シェルがここを通りますみんな(非表示)ファイルであり、コードによって名前が変更されていないファイルはrename無視されます。また、in、inで大文字と小文字を区別しないファイル名のみを渡すようにシェルに指示するか、グローバル設定オプションを使用することもできます。renameperlpre_./~(i)*pre_*ksh93./(#i)*pre_*zsh -o extendedglobnocaseglobbashzshyash./*[pP][rR][eE]_*

おすすめ記事