递归列出所有与被扫描目录相关的路径的文件

递归列出所有与被扫描目录相关的路径的文件

假设我们有类似这样的内容:

/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

答案1

使用 GNU find:

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

答案2

如果你使用 GNU find,至少你可以这样做:

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

() 使其在子 shell 中运行,因此您的 cwd 不受影响。-type f 仅匹配常规文件,这可能比 -name '*' 更好,但语义略有不同。

答案3

还有一种可能性,类似于@rici的回答:

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

这避免了-printf效率可能略有降低(但可能不明显)的情况,并且它是一种非通用的 GNU 扩展 - 但是如果您有任何以 开头的文件/子目录,它就会失败.

您也可以只对find输出进行后处理:

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

答案4

shopt-s globstar

startdir="/tmp/tmp.KVKc82GspR"
对于“${startdir}”/** 中的文件;执行
    回显“${file/${startdir}}”
完毕

这将查找目录中的所有文件并列出它们。它是递归的。我相信它需要 bash 4 或更高版本。

如果你想查看当前目录中的文件:

shopt-s globstar
# ls 命令的第一个参数是 1(一)
ls -1d**

因此这可以是这样的一行:

shopt-s globstar; ls 1d**

相关内容