![심볼릭 링크 깨짐을 방지하는 방법과 sed 정규식 대신 Perl을 언제 사용해야 합니까?](https://linux55.com/image/145734/%EC%8B%AC%EB%B3%BC%EB%A6%AD%20%EB%A7%81%ED%81%AC%20%EA%B9%A8%EC%A7%90%EC%9D%84%20%EB%B0%A9%EC%A7%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EA%B3%BC%20sed%20%EC%A0%95%EA%B7%9C%EC%8B%9D%20%EB%8C%80%EC%8B%A0%20Perl%EC%9D%84%20%EC%96%B8%EC%A0%9C%20%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
기반으로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 코드에서 링크를 가리키는 파일 이름으로 바꿉니다.펄 readlink
함수그런 다음 평소대로 입력을 반복합니다.
$ 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
동일한 파일 이름을 두 번 이상 수정하지 않으려면 유사한 방법이 필요할 수 있습니다.