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