假设我们有类似这样的内容:
/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**