O argumento --xform
usa qualquer número de expressões substitutas de sed
, que são muito poderosas. No seu caso, use um padrão que corresponda a tudo até o último /
e substitua-o por nada:
tar cvf allfiles.tar --xform='s|.*/||' $(<mylist.txt)
Adicione --show-transformed-names
para ver os novos nomes.
Note que esta substituição se aplica a todos os nomes de arquivos, não apenas àqueles dados na linha de comando, por exemplo, se você tiver um arquivo /a/b/c
e sua lista especificar /a
, o nome final do arquivo é apenas c
, não b/c
. Você sempre pode ser mais explícito e fornecer uma lista exata de substituições, por exemplo, no seu caso
--xform='s|^tmp/path2/||;s|^tmp/||;s|^path3/||'
Note que o /
inicial será removido pelo tar (a menos que você use -P
), então as expressões acima estão faltando. Além disso, a lista de diretórios deve ser classificada para que a correspondência mais longa seja feita primeiro. Caso contrário, tmp/path2/
não corresponderá, pois tmp/
já foi removido. Mas você pode automatizar a criação desta lista, por exemplo:
--xform="$(sed <mylist.txt 's|[^/]*$||; s|^/||; s:.*:s|^&||;:' | sort | tr -d '\n')"