シンボリックリンクの破損を防ぐ方法とsed正規表現の代わりにPerlをいつ使用する必要がありますか?

シンボリックリンクの破損を防ぐ方法とsed正規表現の代わりにPerlをいつ使用する必要がありますか?

に基づいてsed -iがシンボリックリンクを破るのを防ぐ方法は?しかし、私はPerlを使用しています。

私は次の質問をすべて試しました。

しかし、成功しませんでした。以下は小さくて簡単な例です。

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

while (<>) 
{

  ## For all lines, replace all occurrences of #5c616c with another colour
  s/#5c616c/#8bbac9/g $(readlink -e -- "<>")

  ## $(readlink -e -- "<>") is similar to --in-place --follow-symlinks

  ## Print the line
  print;
}

ベストアンサー1

このreadlink -eコマンドは移植可能ではないため、依存してはいけません。

$ cat input
Like quills upon the fretful porpentine.
$ ln -s input alink
$ readlink -e alink
readlink: illegal option -- e
usage: readlink [-n] [file ...]

Perlコードでリンクを指すファイル名に置き換えます。Perlreadlink関数その後、通常どおり入力を繰り返します。

$ perl -i -ple 'BEGIN{for(@ARGV){ $_=readlink if -l }} tr/A-Z/a-z/' alink

alinkそれでもシンボリックリンクで、内容が修正さinputれました。

$ perl -E 'say readlink "alink"'
input
$ cat input
LIKE QUILLS UPON THE FRETFUL PORPENTINE.

Perlスクリプトでは、次のように見えます。

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

for my $arg (@ARGV) {
    $arg = readlink $arg if -l $arg;
}

# in-place edit with backup filename, perldoc -v '$^I'
$^I = ".whoops";

while (readline) {
    s/#5c616c/#8bbac9/g;
    print;
}

入力に重複したファイル名が含まれている場合、List::Util::uniq同じファイル名を複数回変更しない場合は、同様の方法が必要になる場合があります。

おすすめ記事