O Pax analisa /.*\//directory\//p
como:
-
/
é o caractere separador. -
.*\
é a expressão regular, correspondendo a qualquer sequência que termina com uma barra invertida (a barra invertida cita o próximo caractere). -
/
separa a expressão regular do texto de substituição. -
/
termina o texto de substituição. -
directory\//p
está perdendo lixo.
Evidentemente, você pretendia usar as barras invertidas para proteger as barras de modo que elas fizessem parte da regex em vez de separadores. Para um script de shell, há barras invertidas extras lá (mas podem ser devido ao fato de que isso está acontecendo em um script perl, mais sobre isso mais tarde). Há também algo de errado com as barras. Se você quiser remover any/leading/prefix/up/to/directory
dos caminhos, então deve ser
pax -r -z -s '/.*\/directory\///p' -f "$input_path/$tgz"
Seria mais fácil ler com um separador diferente. Então você não precisaria escapar de barras.
pax -r -z -s '!.*/directory/!!p' -f "$input_path/$tgz"
Tudo isso assume que o comando é um comando shell . Você menciona um script Perl; O Perl adicionaria sua própria camada de cotação, então o que escrever depende de como a string é inserida no script Perl. O uso de $input_path/$tgz
é definitivamente problemático porque está interpolando uma string em um script de shell, de modo que a string será analisada como um fragmento de shell em vez de um nome de arquivo.
Se o comando shell estiver entre aspas duplas ou backticks, as barras invertidas precisam ser duplicadas. Ainda há o problema da barra perdida. Aqui está uma maneira de escrever isso em Perl:
my $quoted_file_name = quotemeta("$input_path/$tgz");
system("pax -r -z -s '!.*/directory/!!p' -f $quoted_file_name");
Se você estiver usando system
, use o formulário de lista para evitar problemas de cotação, não invocando um shell intermediário.
system('pax', '-r', '-z', '-s', '!.*/directory/!!p', '-f', "$input_path/$tgz");