在linux命令行中将子目录中的文件写入csv文件并将其保存到父目录

在linux命令行中将子目录中的文件写入csv文件并将其保存到父目录

我有一个名为“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' \;

这需要程序findbashbasename

使用它时您应该格外小心,该目录不包含名称与自动生成的 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”的文件。

相关内容