pax, 잘못된 대체 문자열 옵션

pax, 잘못된 대체 문자열 옵션

사용법을 이해하고 있습니다 pax.

배경:.tgz파일을 공급 pax하고 추출하여 파일로 가득 찬 폴더를 얻으십시오.

내가 이해하지 못하는 것은 다음과 같습니다.

pax -r -z -s '/.*\\//directory\\//p' -f $input_path/$tgz

여기서 는 $input_path경로를 포함하는 Perl의 스칼라 변수이고 는 $tgz파일 이름을 포함하는 또 다른 스칼라 변수입니다 .tgz.

그래서 -r읽는 것이 합리적 -z이고, 압축을 풀어도 좋습니다. 그리고 -s로고가 -f나를 혼란스럽게 한다. 다음과 같은 오류가 발생합니다: pax: Invalid replacement string option /.*\\//directory\\//p.

내 생각에 플래그가 작동하는 방식은 다음과 같습니다.

-f, 이는 문제가 되지 않는 것 같습니다. 여기에 파일이 배치됩니다.

-s, 문자열 교체는 파일에 포함된 파일 이름을 수정합니다 .tgz.

/.*\\//directory\\//p여기서 무슨 일이 일어나고 있는지, 모든 슬래시가 빠져나가는 것을 정말로 이해하지 못하기 때문에 누구든지 이 부분을 이해할 수 있습니까 ? \그리고 p뭔가를 해야 하지만 무엇을 해야 할지 모르겠습니다.

답변1

Pax는 /.*\\//directory\\//p다음과 같이 결심합니다.

  • /구분 기호입니다.
  • .*\\백슬래시(백슬래시는 다음 문자를 인용함)로 끝나는 모든 문자열과 일치하는 정규식입니다.
  • /정규식을 대체 텍스트와 분리하세요.
  • /대체 텍스트를 종료합니다.
  • directory\\//p쓰레기를 뒤지고 있는 거죠.

분명히 백슬래시를 사용하여 슬래시를 보호하여 구분 기호가 아닌 정규식의 일부가 되도록 하려고 합니다. 쉘 스크립트의 경우 추가 백슬래시가 있습니다(그러나 이는 아마도 Perl 스크립트에서 발생하는 현상 때문일 수 있습니다. 자세한 내용은 나중에 설명하겠습니다). 슬래시도 문제가 있습니다. 경로에서 제거 하려면 any/leading/prefix/up/to/directory다음과 같아야 합니다.

pax -r -z -s '/.*\/directory\///p' -f "$input_path/$tgz"

다른 구분 기호를 사용하면 읽기가 더 쉬워집니다. 그러면 슬래시를 벗어날 필요가 없습니다.

pax -r -z -s '!.*/directory/!!p' -f "$input_path/$tgz"

이 모든 것은 명령이 다음과 같다고 가정합니다.껍데기주문하다. Perl 스크립트에 대해 언급하셨는데 Perl은 자체 참조 레이어를 추가하므로 작성하는 내용은 문자열이 Perl 스크립트에 삽입되는 방식에 따라 달라집니다. $input_path/$tgz문자열을 쉘 스크립트에 삽입하므로 문자열이 파일 이름이 아닌 쉘 조각으로 구문 분석되기 때문에 사용은 확실히 문제가 있습니다.

쉘 명령이 큰따옴표나 백틱 사이에 있으면 백슬래시를 두 배로 늘려야 합니다. 여전히 슬래시가 잘못 정렬되는 문제가 있습니다. Perl로 작성된 한 가지 방법은 다음과 같습니다.

my $quoted_file_name = quotemeta("$input_path/$tgz");
system("pax -r -z -s '!.*/directory/!!p' -f $quoted_file_name");

를 사용하는 경우 system중간 쉘을 호출하지 않음으로써 인용 문제를 방지하려면 목록 형식을 사용해야 합니다.

system('pax', '-r', '-z', '-s', '!.*/directory/!!p', '-f', "$input_path/$tgz");

관련 정보