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

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

我试图弄清楚如何导出目录中的文件名称,以保存在可以在 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

我希望 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 ...

答案1

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

$ 'ls' > files.csv

这里有一些微妙之处:

  1. 您需要引用该ls命令,以防您的别名添加了影响输出的标志,例如-F,它附加文件类型符号,或者-C,它强制多列输出。此类别名在现代 Unix 和类 Unix 系统上非常常见。

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

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

但如果有的话怎么办特殊字符?

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

处理这些情况并不太困难。

首先,我们以其中可能仅包含逗号的文件为例。这将是一个更常见的情况,因为双引号在 Unix 命令 shell 中有意义,因此在文件名中使用它们会受到强烈的抑制:

$ 'ls' | sed -e 's/^/"/' -e 's/$/"/' > files.csv

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

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

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

$ 'ls' | sed -e 's/"/\\"/g' -e 's/^/"/' -e 's/$/"/' > files.csv

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

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

$ 'ls' | sed -e 's/"/""/g' -e 's/^/"/' -e 's/$/"/' > files.csv

答案2

find * > yourfilename.csv容易多了。

答案3

这:

find ~/Music -maxdepth 3 -type f -iname "*.mp3" -printf "%h,%f,%CY-%Cm-%Cd %CT,%s,%u,%M\n" > mymusic.csv

相关内容