Eu gostaria de usar find
para listar todos os arquivos e diretórios recursivamente em uma determinada raiz para uma cpio
operação. No entanto, não quero que o diretório raiz apareça nos caminhos. Por exemplo, atualmente recebo:
$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2
Mas eu gostaria de obter
file1
dir1
dir1/file2
(observe que a raiz também não está na saída desejada, mas é fácil livrar-se disso tail
).
Estou no OS X e prefiro não instalar nenhuma ferramenta extra (por exemplo, GNU find), se possível, pois gostaria de compartilhar o script que estou escrevendo com outros usuários do OS X.
Estou ciente de que isso pode ser feito cut
para reduzir a listagem de raiz, mas isso parece uma solução abaixo do ideal. Existe uma solução melhor disponível?
find diskimg/* | cut -d '/' -f2-
Respostas:
Se o que você está tentando fazer não for muito complexo, você poderá fazer isso com o sed:
Ou
cut
:fonte
find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'
(observe que eu adicionei também '-e' e uma^
prática recomendada (não é necessária aqui, pois você tem certeza de que todas as linhas terão isso ... mas ainda é uma prática recomendada) e economiza um pouco de CPU;))find diskimg | sed -e 's|^diskimg/*||'
(o '/ *' corresponderá a qualquer número de '/', até 0)cut
comando é mais limpo que o que eu usei; Eu gosto disso. (Ased
solução também é boa, mas a repetição dediskimg/
é um pouco infeliz).cd
no diretório primeiro:Após a conclusão, você estará de volta ao seu diretório raiz.
Seus arquivos serão anexados com ./ neste caso; a única maneira que vejo ao redor disso seria usando
cut
:Use um subshell para evitar alterar o diretório atual do seu shell (isso não é necessário se você estiver canalizando a saída porque o lado esquerdo de um pipe já roda em um subshell).
fonte
(cd diskimg && find . ; )
. Dessa forma, issocd diskimg && find .
é feito em um subshell: quando esse subshell sai, você volta ao seu próprio shell, em qualquer diretório em que estava.find *
é outra maneira de contornar o prefixo inútilOutro, mais complexo, mas apenas usando a abordagem find da minha outra resposta:
fonte
find
suporteprintf
.find
suporta-printf
, embora muitos BSDsfind
tenham copiado alguns dos recursos do GNUfind
, nenhum-printf
ainda foi copiado (AFAIK).%P
caminho relativo era o que eu precisava.Use o
realpath
utilitário:fonte
--relative-to
.