Listar recursivamente todos os arquivos com o caminho relativo ao diretório sendo varrido

0

Digamos que temos algo como:

/tmp/tmp.KVKc82GspR
/tmp/tmp.KVKc82GspR/CONTENTS
/tmp/tmp.KVKc82GspR/opt
/tmp/tmp.KVKc82GspR/opt/source
/tmp/tmp.KVKc82GspR/opt/source/sm
/tmp/tmp.KVKc82GspR/opt/source/sm/LVHDoISCSISR.py
/tmp/tmp.KVKc82GspR/opt/source/sm/LVHDoHBASR.py
/tmp/tmp.KVKc82GspR/verify_update

Eu quero receber:

CONTENTS
opt/source/sm/LVHDoISCSISR.py
opt/source/sm/LVHDoHBASR.py
verify_update

Eu tenho algumas opções, mas não gosto delas:

  • cd /tmp/tmp.KVKc82GspR; find . -name '*' adicionaria ./ antes e pior mudaria diretório atual.
  • ls não funciona bem recursivamente

Nota: Eu preferiria uma solução de linha única, se possível: D

    
por sorin 05.10.2012 / 16:38

4 respostas

2

Com o GNU find:

find /tmp/tmp.KVKc82GspR -mindepth 1 -printf '%P\n'
    
por 05.10.2012 / 16:44
2

Se você está usando o GNU, pelo menos, você pode fazer isso:

(cd /tmp/tmp.KVKc82GspR; find . -type f -printf '%P\n')

O () faz com que ele seja executado em um subshell para que seu cwd não seja afetado. -tipo f combina apenas com arquivos regulares, o que é possivelmente um estilo melhor que -name '*', mas tem uma semântica um pouco diferente.

    
por 05.10.2012 / 16:48
0

Outra possibilidade, semelhante à resposta de @rici:

(cd /tmp/tmp.KVKc82GspR; find * -type f -print)

Isso evita que o -printf seja ligeiramente (mas talvez não perceptível) menos eficiente, e que seja uma extensão GNU não-universal - no entanto, ele falhará se você tiver quaisquer arquivos / subdiretórios que comecem com . .

Você também pode pós-processar a saída find s:

find /tmp/tmp.KVKc82GspR -type f -print | sed -e 's;^/tmp/tmp.KVKc82GspR/;;'
    
por 05.10.2012 / 17:31
0
shopt -s globstar

startdir="/tmp/tmp.KVKc82GspR"
for file in "${startdir}"/**; do
    echo "${file/${startdir}}"
done

Isso localizará todos os arquivos no diretório e os listará. É recursivo. Eu acredito que vai exigir bash 4 ou superior.

Se você quiser ver os arquivos em seu diretório CURRENT:

shopt -s globstar
# the ls command has a 1 (one) as the first argument
ls -1d **

Então, isso pode ser uma única linha assim:

shopt -s globstar ; ls 1d **
    
por 06.10.2012 / 00:19

Tags