如果我的终端当前处于home/stuff/stuff2
并且下有更多文件夹和文件stuff2
,我该如何启动命令来获取从该目录及以后的所有文件和文件夹的文件名(包括所有子目录)。
该操作需要执行以下操作:
- 文件路径必须从终端命令的位置开始,所以我不需要完整的文件路径。例如,
home/stuff/stuff2/stuff3/cat.png
我更希望读出的是stuff3/cat.png
- 它必须捕获每个文件、文件夹以及这些文件夹内的文件。
- 它需要通过管道(我认为这是术语)传输到文本文件。
有任何想法吗?
答案1
命令
find -printf "%P\n" > file
将列出当前目录下的所有文件和目录,并重定向列表到file
。从printf
部分man find
%P File's name with the name of the command line argument
under which it was found removed.
答案2
除此之外find
,仅使用 shell 也可以做到这一点bash
:
shopt -s globstar
printf "%s\n" ** >file
打印所有输出文件名相对的到当前目录。
shopt -s globstar
启用globstar
,它提供了bash
的一些功能find
。使用globstar
,两颗星号连成一排,正如man bash
所述,“匹配所有文件和零个或多个目录和子目录”。此处,printf
用于将文件名格式化为一行。输出将发送到名为 的文本文件file
。
文件名含有特殊字符
本题要求在文本文件中输出。文本文件通常以换行符分隔行。如果任何文件或目录名称本身包含换行符,则会导致混淆。除非已知不存在这样的文件,否则最好使用以空字符分隔的文件,而不是以换行符分隔的文本文件。
在这种情况下,可以使用:
printf "%s\000" ** >file
或者,
find -print0 >file
由于文件名中永远不允许出现空字符(ascii 000),因此这是可用于在文件中存储文件名而不会丢失信息的一种格式。
答案3
如果您可以处理“。/dir/filename”形式的文件,那么 find 命令的简单形式就可以起作用:
find . -type f > filename
将当前目录下的所有文件放入“filename”中。
看到@steeldriver 的回答后,他的解决方案和我的解决方案的结合将消除“./”前缀,如下所示:
如果你不是希望列表中包含空白目录名(即,仅包含每个目录中的文件名,
find -type f -printf "%P\n" > file
如果你真的做想要目录名称以及目录/文件名,那么从所有示例中省略“-type f”标志。