13

どのように変換しますか:

$ find . -ls > /tmp/files.txt

これは私に次のようなものを与えます:

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

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

ファイル名にスペースを含むタイトルの例を次に示します。

652640,80,-rw-rw-r--,1,david,staff,40036,Nov,6,15:32,./v_all_titles/V Catalog Report 11.5.xlsx
4

7 に答える 7

7

コマンドラインで入力するには少し長いですが、ファイル名のスペースを適切に保持します (そして引用符も付けます!)。

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("\"", "\"\"") + "\""
'
于 2013-01-29T00:10:32.503 に答える
5

日付のスペースを気にしない場合:

$ find . -ls | tr -s ' ' ,

それらのスペースを気にする場合:

$ 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 )}'

ファイル名に空白が含まれている場合、これらはどちらも機能しません。ファイル名のスペースを処理するためのハックとして、次を試すことができます。

 ... | sed 's/,/ /8g'

最初の 8 個のコンマを除くすべてを削除するには ( gnu sedのようsedに非標準オプションをサポートしていると仮定します)。8gもちろん、これはファイル名のコンマを処理しません。

于 2013-01-28T23:40:42.860 に答える
2

そしてさらに別の変種。カスタマイズするには、 findの man ページのセクション「-printf format」を参照してください。

$ find . -type f -fprintf /tmp/files.txt "%i,%b,%M,%n,%u,%g,%s,%CY-%Cm-%Cd %CT,%p\n"

出力例:

$ less /tmp/files.txt

3414558,40,-rw-rw-r--,1,webwurst,webwurst,16542,2014-09-18 15:54:36.9232917780,./dump_info.py
3414559,8,-rw-rw-r--,1,webwurst,webwurst,68,2014-09-18 15:54:51.1752922580,./metadata
于 2014-09-18T13:57:29.563 に答える
1

これが私が下書きしたpythonスクリプトです...

#!/opt/app/python/bin/python
# Convert ls output to clean csv    Paolo Villaflores 2015-03-16
#
# Sample usage: ls -l | ls2csv.py
#
# Features:
#   accepts -d argument to change dates to yyyy-mm-dd_hhmm format
#   input is via stdin
#   separate file/directory field
#   handle -dils type input (find -ls) versus -l
#   handle space in filename, by applying quotes around filename
#   handle date - format into something excel can handle correctly, whether it is from current year or not.
#   adds a header
#   handle symlinks - type l



import sys
from datetime import datetime

b0=True

def is_f(s):
  if s == '-':
    return 'f'
  return s

for line in sys.stdin:
    if len(line) < 40:
      continue
    if b0:
      b1=line[0] in ['-', 'd', 'c', 'l'] # c is for devices e.g. /devices/pseudo/pts@0:5, l is for symbolic link
      b0=False
      if b1:  # true when shorter ls -l style 8/9 columns. 9 for symlink
        cols=7
        print "d,perms,#links,owner,group,size,modtime,name,symlink"
      else:
        cols=9
        print "inode,bsize,d,perms,#links,owner,group,size,modtime,name,symlink"
    r = line.strip("\n").split(None, cols+1)
    if len(r) < cols+1:
      continue
    if r[cols-7][0] == 'c':
       continue  # ignore c records: devices
    fn = r.pop()
    if b1:
      c = ''
    else:
      c = ",".join(r[0:2]) + ","
    z = 0
    z = r[cols].find(':')
    if z < 0:
      d = r[cols - 1] + "/" + r[cols - 2] + "/" + r[cols]
    else:
      n = str(datetime.now()  )
      d = ''
      # handle the case where the timestamp has no year field
      tm=datetime.strptime(r[cols-2]+ " " + r[cols-1]+ " " + n[:4] +" " + r[cols], "%b %d %Y %H:%M")
      if (tm-datetime.now()).days > 0:
        d = r[cols - 1] + "/" + r[cols - 2] + "/" + str((datetime.now().year-1)) + " " + r[cols]
        tm=datetime.strptime(r[cols-2]+ " " + r[cols-1]+ " " + str(int(n[:4])-1) +" " + r[cols], "%b %d %Y %H:%M")
      else:
        d = r[cols - 1] + "/" + r[cols - 2] + "/" + " ".join([n[:4], r[cols] ] )
      if len(sys.argv) > 1 and sys.argv[1] == '-d':
        d=tm.strftime("%Y-%m-%d_%H%M")

    y = fn.find(">")
    symlink=''
    if y > 0:
       symlink = ',\"' + fn[y+2:] + '"'
       fn = fn[:y-2]
    if  fn.find( " ") <0:
      if fn.find('"') <0:
        fn2=fn
      else:
        fn2="'" + fn + "'"
    else:
      fn2="'" + fn + "'"
    print c+ is_f(r[cols-7][0]) + ",\"" + r[cols-7][1:] + "\"," + ",".join(
      r[cols-6:cols-2]) + "," + d + "," + fn2 + symlink
于 2015-04-05T06:46:24.950 に答える
0

これは仕事をする必要があります

 find . -ls|awk 'BEGIN{OFS=","}$1=$1'
于 2013-01-28T23:49:52.907 に答える