に基づいて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
同じファイル名を複数回変更しない場合は、同様の方法が必要になる場合があります。