Como posso forçar apenas caminhos relativos na saída “find”?

17

Eu estou tentando criar um script que pode compactar arquivos com uma certa extensão em vários diretórios em uma única tar-ball. Atualmente, o que eu tenho no arquivo de script é:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

Em que $rootDir é o caminho base para pesquisar.

Isto está bem, exceto que os caminhos são absolutos no arquivo tar. Eu preferiria que os caminhos fossem relativos a $rootDir . Como eu faria isso?

Exemplo de% atualtar -tf docs.tar em que $rootDir é /home/username/test output:

home/username/test/subdir/test.doc
home/username/test/second.doc

O que eu desejo que a saída seja:

./subdir/test.doc
./second.doc
    
por Shane 12.11.2009 / 10:12

2 respostas

11

Se você executar find do diretório raiz desejado e não especificar um ponto de partida absoluto nas opções de find , ele exibirá os caminhos relativos às chamadas de comandos tar que ele constrói. Assim:

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

Se você não deseja alterar o diretório de trabalho atual permanentemente e está usando bash ou similar ao seu shell, você poderia fazer

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

em vez disso.

Observe que o pushd / popd não está presente em todos os shells, portanto, verifique a man page, conforme apropriado. Eles estão presentes no bash, mas não na implementação base sh, enquanto explicitamente usando /bin/bash você pode confiar neles, você não pode se um script pedir /bin/sh (como isso pode mapear para um shell menor que não tem melhorias do bash)

    
por 12.11.2009 / 10:29
0

Você pode usar o formato %P na diretiva -printf :

find ${rootDir} -name '*.doc' -printf "%P\n"

será exibido no seu exemplo:

subdir/test.doc
second.doc

Você pode então usar essa lista find em uma expressão for , para executar nosso comando exec, como em:

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done
    
por 23.05.2018 / 17:55