펄 -i를 클로버 심볼릭 링크로 만들지 않는 방법이 있습니까? 문의 기본값으로 선택합니다. 확장명 (제공된 경우)은

내 친구는 당신이 그렇게하면 :

perl -pi.bak -e 's/foo/bar/' somefile

“somefile”이 실제로 심볼릭 링크 인 경우, perl은 문서에서 수행 할 작업을 수행합니다.

입력 파일 이름을 바꾸고 원래 이름으로 출력 파일을 연 다음 해당 출력 파일을 print () 문의 기본값으로 선택합니다. 확장명 (제공된 경우)은 백업 사본을 만들기 위해 이전 파일의 이름을 수정하는 데 사용됩니다 …]

변경되지 않은 실제 파일을 가리키는 새로운 심볼릭 링크 “somefile.bak”와 변경된 일반 파일 “somefile”이 변경됩니다.

대부분의 경우 심볼릭 링크를 따르는 것이 바람직한 동작입니다 (.bak 파일의 올바른 위치를 모호하게 남겨도). 랩퍼에서 심볼릭 링크를 테스트하고 케이스를 적절하게 처리하는 것 이외의 다른 방법이 있습니까?

( sed가치가있는 것과 같은 일을합니다.)



답변

moreutils 의 작은 sponge범용 유틸리티 ( “표준 입력을 가져 와서 파일에 쓰기”) 가이 경우에 도움이되는지, 그것이 심볼릭 링크를 따를 것인지 궁금 합니다.

저자 는 다음 sponge 과 같이 설명 합니다.

Unix 도구를 사용하여 파일을 편집하는 문제를 해결합니다. 즉, 출력을 편집하려는 파일로 출력을 리디렉션하면 파이프 라인의 첫 번째 명령 전에 리디렉션이 적용됩니다 (파일의 내용을 복제). 파일에서 읽습니다. 같은 스위치 sed -i
perl -i이 문제를 해결하지만, 당신이 파이프 라인에 사용할 수없는 모든 명령은 옵션이 있습니다, 당신은 어쨌든 여러 명령 파이프 라인과 그 방법을 사용할 수 없습니다.

나는 보통 다음과 같이 스폰지를 조금 사용합니다.

sed '...' file | grep '...' | sponge file

답변

somefile심볼릭 링크 인 사실을 알고 있는 경우 다음을 사용하여 파일의 전체 경로를 명시 적으로 제공 할 수 있습니다.

perl -pi.bak -e 's/foo/bar/' $(readlink somefile)

이렇게하면 원본 파일로 직접 교체되므로 원본 심볼릭 링크는 그대로 유지됩니다.


답변

단일 파일을 처리하는 경우 명령은 다음과 같습니다.

perl -i -pe'...' -- "$qfn"

해결책은 다음과 같습니다.

perl -i -pe'...' -- "$( readlink -e -- "$qfn" )"

심볼릭 링크와 심볼릭 링크를 모두 처리합니다.


임의로 많은 수의 파일을 처리하는 경우 명령은 다음과 같습니다.

... | xargs -r perl -i -pe'...' --

해결책은 다음과 같습니다.

... | xargs -r readlink -ze -- | xargs -r0 perl -i -pe'...' --

심볼릭 링크와 심볼릭 링크를 모두 처리합니다.


주의 사항 readlink 은 표준 명령이 아니므로 존재 여부, 주장 및 기능이 시스템마다 다르므로 설명서를 확인하십시오. 예를 들어, 일부 구현에는 -f(여기에서도 사용할 수 있음) 있지만 -e일부는 없습니다. busyboxreadlink -fGNU와 같은 동작합니다을 readlink -e. 그리고 일부 시스템에는 일반적으로 GNU처럼 동작 하는 realpath명령 이 있습니다 .readlinkreadlink -f

GNU readlink -e에서는 기존 파일로 확인할 수없는 심볼릭 링크가 자동으로 제거됩니다.


답변