将ls输出转换为csv

Dav*_*542 10 unix linux csv find

我将如何转换:

$ find . -ls > /tmp/files.txt
Run Code Online (Sandbox Code Playgroud)

这给了我类似的东西:

908715       40 -rwxrwxr-x    1 david            staff               16542 Nov 15 14:12 ./dump_info.py
908723        0 drwxr-xr-x    2 david            staff                  68 Nov 20 17:35 ./metadata
Run Code Online (Sandbox Code Playgroud)

进入csv输出?它看起来像:

908715,40,-rwxrwxr-x,1,david,staff,16542,Nov 15 14:12,./dump_info.py
908723,0,drwxr-xr-x,2,david,staff,68,Nov 20 17:35,./metadata
Run Code Online (Sandbox Code Playgroud)

这是一个在文件名中包含空格的示例标题:

652640,80,-rw-rw-r--,1,david,staff,40036,Nov,6,15:32,./v_all_titles/V Catalog Report 11.5.xlsx
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

如果您不关心日期中的空格:

$ find . -ls | tr -s ' ' ,
Run Code Online (Sandbox Code Playgroud)

如果您关心这些空间:

$ find . -ls | awk '{printf( "%s,%s,%s,%s,%s,%s,%s,%s %s %s,%s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11 )}'
Run Code Online (Sandbox Code Playgroud)

如果您的文件名包含任何空格,这些都不会起作用.作为处理文件名中空格的黑客,您可以尝试:

 ... | sed 's/,/ /8g'
Run Code Online (Sandbox Code Playgroud)

摆脱除前8个逗号之外的所有逗号(假设你sed支持非标准8g选项,如gnu sed所做的那样).当然这不会处理文件名中的逗号.

  • `tr`解决方案将用逗号替换文件名中的空格.awk解决方案将无法在空格后打印文件名的任何部分.如果文件名包含换行符,则输出将为多行.此外,如果任何文件名包含逗号,则您的csv将格式错误.如果这些问题相关,则需要做更多的工作.也许只是将输出传递给sed并删除不需要的逗号将处理文件名中的空格... (2认同)

nne*_*neo 5

在命令行输入它有点长,但它正确地保留了文件名中的空格(并引用它!)

find . -ls | python -c '
import sys
for line in sys.stdin:
    r = line.strip("\n").split(None, 10)
    fn = r.pop()
    print ",".join(r) + ",\"" + fn.replace("\"", "\"\"") + "\""
'
Run Code Online (Sandbox Code Playgroud)