获取包含目录中文件名的 CSV 文件?

rdz*_*zvr 3 linux text-processing

我想弄清楚如何导出目录中文件的名称,以保存在可以在 Excel 中编辑的 CSV 文件中。该目录如下所示:

$ ls
Sample_38_41_1_A01  Sample_38_41_1_A11  Sample_38_41_1_B09
Sample_38_41_1_C07  Sample_38_41_1_D05  Sample_38_41_1_E03
Sample_38_41_1_F01
Run Code Online (Sandbox Code Playgroud)

我希望 CSV 文件的每一行都具有在该目录中找到的文件的名称。在 Excel 中它应该是这样的:

A            B    C
1 Sample_38_41_1_A01
2 Sample_38_41_1_A11
3 Sample_38_41_1_B09 
4 Sample_38_41_1_C07 
5 Sample_38_41_1_D05
6 Sample_38_41_1_E03
7 Sample_38_41_1_F01
8 ...
Run Code Online (Sandbox Code Playgroud)

War*_*ung 12

由于您的示例文件名中没有任何双引号或逗号,因此解决方案非常简单:

$ 'ls' > files.csv
Run Code Online (Sandbox Code Playgroud)

这里有几个微妙之处:

  1. ls如果您有一个别名向命令添加影响输出的标志,您希望引用该命令,例如-F附加文件类型符号的 ,或-C强制多列输出的 。这样的别名在现代 Unix 和类 Unix 系统上很常见。

  2. ls写入管道而不是终端时,它每行打印一个文件名,而不是您在问题中显示的多列输出。在这种情况下POSIX需要单列输出,并且 GNU 和 BSDls服从。

这个 CSV 文件没有标题行,但 Excel 可以处理;并非所有 CSV 阅读器都可以。

但是,如果有特殊字符?

双引号和逗号是 CSV 文件中的特殊字符,因此如果您在包含使用此类字符命名的文件的目录上尝试上述命令,您将无法获得有效的 CSV 文件。

处理这些情况并不太难。

首先让我们以可能只有逗号的文件为例。这将是一个更常见的情况,因为双引号在 Unix 命令外壳中有意义,因此在文件名中使用它们有强烈的阻碍:

$ 'ls' | sed -e 's/^/"/' -e 's/$/"/' > files.csv
Run Code Online (Sandbox Code Playgroud)

这些sed字符串替换命令在每行的开头和结尾放置双引号,这可以防止 CSV 阅读器将逗号视为字段分隔符。

达到相同目的的另一种方法是 perl -ne 'chomp ; print "\"$_\"\n"'

如果您的文件名中确实有双引号,则sed解决方案自然会扩展:

$ 'ls' | sed -e 's/"/\\"/g' -e 's/^/"/' -e 's/$/"/' > files.csv
Run Code Online (Sandbox Code Playgroud)

也就是说,我们在用语义引号将行包起来之前转义任何现有的双引号字符。

一些 CSV 阅读器以不同的方式处理双引号转义,将一行中的两个双引号字符视为文字双引号:

$ 'ls' | sed -e 's/"/""/g' -e 's/^/"/' -e 's/$/"/' > files.csv
Run Code Online (Sandbox Code Playgroud)


小智 6

find * > yourfilename.csv 容易多了。