1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-06-21 00:19:42 +02:00

add support for newlines in filenames (only with ls -l)

This commit is contained in:
Kelly Brazil
2020-02-24 15:19:43 -08:00
parent c8dac32df8
commit 964868c8af
2 changed files with 21 additions and 4 deletions

View File

@ -1,12 +1,15 @@
# jc.parsers.ls # jc.parsers.ls
jc - JSON CLI output utility ls Parser jc - JSON CLI output utility ls Parser
Note: The -l option of ls should be used to correctly parse filenames that include newline characters.
Since ls does not encode newlines in filenames when outputting to a pipe it will cause jc to see
multiple files instead of a single file if -l is not used.
Usage: Usage:
specify --ls as the first argument if the piped input is coming from ls specify --ls as the first argument if the piped input is coming from ls
ls options supported: ls options supported:
- None
- laR - laR
--time-style=full-iso --time-style=full-iso
- h file sizes will be available in text form with -r but larger file sizes - h file sizes will be available in text form with -r but larger file sizes

View File

@ -1,11 +1,14 @@
"""jc - JSON CLI output utility ls Parser """jc - JSON CLI output utility ls Parser
Note: The -l option of ls should be used to correctly parse filenames that include newline characters.
Since ls does not encode newlines in filenames when outputting to a pipe it will cause jc to see
multiple files instead of a single file if -l is not used.
Usage: Usage:
specify --ls as the first argument if the piped input is coming from ls specify --ls as the first argument if the piped input is coming from ls
ls options supported: ls options supported:
- None
- laR - laR
--time-style=full-iso --time-style=full-iso
- h file sizes will be available in text form with -r but larger file sizes - h file sizes will be available in text form with -r but larger file sizes
@ -145,7 +148,7 @@ import jc.utils
class info(): class info():
version = '1.1' version = '1.2'
description = 'ls command parser' description = 'ls command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -233,6 +236,8 @@ def parse(data, raw=False, quiet=False):
# Pop following total line # Pop following total line
linedata.pop(0) linedata.pop(0)
new_section = False
if linedata: if linedata:
# Check if -l was used to parse extra data # Check if -l was used to parse extra data
if re.match('^[-dclpsbDCMnP?]([-r][-w][-xsS]){2}([-r][-w][-xtT])[+]?', linedata[0]): if re.match('^[-dclpsbDCMnP?]([-r][-w][-xsS]){2}([-r][-w][-xtT])[+]?', linedata[0]):
@ -241,15 +246,24 @@ def parse(data, raw=False, quiet=False):
parsed_line = entry.split(maxsplit=8) parsed_line = entry.split(maxsplit=8)
if not re.match('^[-dclpsbDCMnP?]([-r][-w][-xsS]){2}([-r][-w][-xtT])[+]?', entry) \ if new_section \
and not re.match('^[-dclpsbDCMnP?]([-r][-w][-xsS]){2}([-r][-w][-xtT])[+]?', entry) \
and entry.endswith(':'): and entry.endswith(':'):
parent = entry[:-1] parent = entry[:-1]
new_section = False
continue continue
if re.match('^total [0-9]+', entry): if re.match('^total [0-9]+', entry):
continue continue
if entry == '': if entry == '':
new_section = True
continue
# fixup for filenames with newlines
if not new_section \
and not re.match('^[-dclpsbDCMnP?]([-r][-w][-xsS]){2}([-r][-w][-xtT])[+]?', entry):
raw_output[-1]['filename'] = raw_output[-1]['filename'] + '\n' + entry
continue continue
# split filenames and links # split filenames and links