我试图弄清楚如何导出目录中的文件名称,以保存在可以在 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
这里有一些微妙之处:
您需要引用该
ls
命令,以防您的别名添加了影响输出的标志,例如-F
,它附加文件类型符号,或者-C
,它强制多列输出。此类别名在现代 Unix 和类 Unix 系统上非常常见。什么时候
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