Com o GNU find:
find /tmp/tmp.KVKc82GspR -mindepth 1 -printf '%P\n'
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
Com o GNU find:
find /tmp/tmp.KVKc82GspR -mindepth 1 -printf '%P\n'
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.
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/;;'
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 **
Tags bash