Isso é realmente fácil com pax
. Ele tem uma noção de uma opção -s
ubstitution que pode alterar nomes de arquivos à medida que são gravados. Você também pode especificar mais de um argumento -s
ubstitution. E, mais relevante aqui, é que os membros selecionados têm apenas tantos argumentos -s
ubstitution aplicados quanto necessário para fazer uma correspondência com sucesso, mas qualquer substituição que resulte em um nome de arquivo nulo faz com que o arquivo correspondente não seja selecionado.
Para demonstrar:
mkdir test; cd test
touch match nomatch
pax -ws '|^.*/match$|&|' -s '|.*||' ./ |
pax -v
O acima faz e se transforma em um diretório ./test
, cria dois arquivos e, em seguida, -w
rites um tar
archive em um canal com pax
cujo conteúdo um segundo pax
-v
erbosely listas. As impressões acima:
-rw-r--r-- 1 mikeserv mikeserv 0 Feb 22 11:40 ./
... porque ./match
é correspondido antes da subtituição final, que substitui todos os caracteres em qualquer nome de arquivo.
E com pax
você realmente não precisa copiar o conteúdo de um arquivo para o seu arquivo - você pode usar -rwl
, que é uma operação de cópia que cria hardlinks.
Então, se o seu arquivo foi nomeado paxscript
e parecia ...
cd -- "$1"
pax -rwvl \
-s '|^.*/image1\.jpg$|&|' \
-s '|^.*/photo3\.jpg$|&|' \
-s '|^.*/redcar\.jpg$|&|' \
-s '|^.*/balloon2323\.jpg$|&|' \
-s '|.*||' ./ ../"${1##*/}.mirror"
cd - >/dev/null
... e então você executou como ...
. ./paxscript "$targetdir"
Ele criaria um espelho de "$targetdir"
em seu parentdir contendo apenas hardlinks para os nomes de arquivos que você deseja combinar. Você pode então verificar se os resultados estão do seu agrado antes de fazer rm -rf "$targetdir"
e se livrar de apenas todos os nomes de caminho que você não deseja.