我有一个名为“dir”的目录,其中有一个名为“subdir”的子目录。Subdir 中有很多文件。我想在 CSV 文件中写入这些文件的列表,并使用 Linux 上的命令行将其保存到“dir”目录中。我的代码创建了 csv 文件,但将其保存在 subdir 而不是 dir 中。我哪里做错了?我在 dir 目录中;
printf "%s\n" * >../list.csv # For non-hidden files.
printf "%s\n" * .* >../list.csv # For all files.
printf "%s\n" * .[^.]* ..?* >../list.csv # For all files but `.` and `..`.
作为一种更简单的选择,您可以 cd 到 subdir 并使用
这将为您提供一个不包含逗号的换行符分隔和换行符终止的列表。您可以将其视为只有一列的退化 csv 文件。
如果您想包含隐藏文件(名称以点开头的文件),您可以使用
* .*
而不是唯一的*
. 如果要排除 . 和 .. 目录名称,请* .[^.]* ..?*
改用。总共:但请记住,Linux 中的文件名本身可能包含换行符。事实上,文件名唯一唯一的单字节分隔符是空字节。
由于此评论而更新:
让我们假设您有任意数量的子目录,您希望将其非隐藏内容编入公共父目录中的单独文件中。(在一个文件中收集所有名称要短得多,请参阅这个优雅的解决方案。而且,说实话,我没有足够仔细地阅读您的评论。)这可以通过在该父目录(在您的情况下为 dir)中实现
这需要程序
find
、bash
和basename
。使用它时您应该格外小心,该目录不包含名称与自动生成的 csv 列表冲突的文件。
它是这样工作的:
find
考虑每个位于当前目录 (.
) 下一个目录级别的文件——这就是它的作用——-mindepth 1 -maxdepth 1
:如果它是一个目录 (-type d
),它执行 (-exec
) 之间的命令和替换空括号后-exec
的尾随\;
({}
) 由该目录的名称。如果我们用 来表示这个名字<SUBDIR>
,结果是这从
bash
一个子进程开始,导致它以-c
shell 脚本的形式执行选项的参数,即这与上面几乎相同。在这里,表达式
扩展为 的基本名称
<SUBDIR>
。这是必要的,因为<SUBDIR>
在您的情况下将遍历 ./subdir1、./subdir2 等。对应的基本名称为 subdir1、subdir2 等。您应该使用for循环来实现它。
如果我的理解是正确的,您想获取子目录中的文件列表。所以做这样的事情:
现在,您可以看到在您的 dir 目录下创建了一个名为“filelist.csv”的文件。