Допустим, у нас есть что-то вроде:

/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

Я хочу получить:

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

У меня есть несколько вариантов, но они мне не нравятся:

  • cd /tmp/tmp.KVKc82GspR; find . -name '*' добавит ./ раньше, а хуже будет изменить текущий каталог.
  • ls не работает хорошо рекурсивно

Примечание: я бы предпочел однострочное решение, если это возможно: D

4 ответа4

2

С помощью GNU найдите:

find /tmp/tmp.KVKc82GspR -mindepth 1 -printf '%P\n'
2

Если вы используете GNU find, по крайней мере, вы можете сделать это:

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

() Заставляет его работать в подоболочке, поэтому ваш cwd не затрагивается. -type f соответствует только обычным файлам, что, возможно, лучше стиля, чем -name '*', но имеет немного другую семантику.

0

Еще одна возможность, похожая на ответ @rici:

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

Это позволяет избежать -printf который может быть немного (но, возможно, не заметно) менее эффективным, и который является неуниверсальным расширением GNU - однако он потерпит неудачу, если у вас есть какие-либо файлы / подкаталоги, которые начинаются с . ,

Вы также можете просто постобработки find s вывод:

find /tmp/tmp.KVKc82GspR -type f -print | sed -e 's;^/tmp/tmp.KVKc82GspR/;;'
0
shopt -s globstar

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

Это найдет все файлы в каталоге и перечислит их. Это рекурсивно. Я считаю, что это потребует Bash 4 или выше.

Если вы хотите увидеть файлы в вашем текущем каталоге:

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

Так что это может быть однострочно так:

shopt -s globstar ; ls 1d **

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .