bash 'ls' 출력을 json 배열로 변환합니다.
bash 스크립트를 사용하여 출력 포맷이 가능합니까?ls
json 배열로요?유효한 json이 되려면 dir와 파일의 모든 이름을 큰따옴표로 묶고 쉼표로 구분하여 전체 이름을 대괄호로 묶어야 합니다.즉, 변환:
jeroen@jeroen-ubuntu:~/Desktop$ ls
foo.txt bar baz
로.
[ "foo.txt", "bar", "baz" ]
edit: 저는 Linux 서버 전체에서 동작하는 것을 매우 선호합니다.따라서 python에 의존하지 않고 순수한 bash 솔루션을 가지고 있습니다.
줄 바꿈이 포함된 파일 이름이 없는 경우 jq:
ls | jq -R -s -c 'split("\n")[:-1]'
jq에 대한 플래그의 간단한 설명:
-R
는 입력을 JSON이 아닌 문자열로 취급합니다.-s
모든 행을 배열에 결합합니다.-c
콤팩트한 출력을 작성하다[:-1]
출력 배열의 마지막 빈 문자열을 삭제합니다.
이를 위해서는 버전 1.4 이상의 jq가 필요합니다.마음에 들지 않는 경우는, 다음의 조작을 실시해 주세요.
ls | jq -R '[.]' | jq -s -c 'add'
네, 하지만 모서리 케이스와 유니코드 처리로 인해 골머리를 앓게 될 거예요.네이티브로 지원하는 스크립트 언어에 위임하는 것이 좋습니다.
$ ls
あ a "a" à a b 私
$ python -c 'import os, json; print json.dumps(os.listdir("."))'
["\u00e0", "\"a\"", "\u79c1", "a b", "\u3042", "a"]
안녕하세요 sed와 awk로 할 수 있습니다.
ls | awk ' BEGIN { ORS = ""; print "["; } { print "\/\@"$0"\/\@"; } END { print "]"; }' | sed "s^\"^\\\\\"^g;s^\/\@\/\@^\", \"^g;s^\/\@^\"^g"
편집: 문제 해결을 위해 업데이트됨"
및 공백입니다.사용하고 있다/@
대체 패턴으로서"
,부터/
파일명에 유효한 문자가 아닙니다.
perl을 인코더로 사용합니다.버그가 없고 어디에나 있으며 파이프가 있는 경우, 여전히 깨끗한 상태를 유지합니다.
ls | perl -e 'use JSON; @in=grep(s/\n$//, <>); print encode_json(\@in)."\n";'
Linux 머신의 대부분은 이미 python을 탑재하고 있습니다.필요한 것은 다음과 같습니다.
python -c 'import os, json; print json.dumps(os.listdir("/yourdirectory"))'
이것은 . 디렉토리용이며 임의의 경로를 추가할 수 있습니다.
여기 bash line이 있습니다.
echo '[' ; ls --format=commas|sed -e 's/^/\"/'|sed -e 's/,$/\",/'|sed -e 's/\([^,]\)$/\1\"\]/'|sed -e 's/, /\", \"/g'
제대로 대처하지 못하다"
,\
또는 파일 이름에 쉼표를 입력합니다.또, 만약ls
파일 이름 사이에 줄 바꿈을 넣습니다.이것도 마찬가지입니다.
Linux 폴더/파일 트리를 JSON 또는 XML 파일로 출력하는 방법도 찾고 있었습니다.다음 간단한 terminal 명령을 사용하면 됩니다.
$ tree --dirsfirst --noreport -n -X -i -s -D -f -o my.xml
linux tree 명령어만으로 파라미터를 설정할 수 있습니다.여기서-X
는 XML 출력을 제공합니다.저는 괜찮습니다.XML을 JSON으로 변환하는 스크립트가 있을 것 같습니다.
메모: 이 질문도 같은 질문이라고 생각합니다.
개인적으로는 명령어 ls를 실행하는 스크립트를 코드화하고 출력을 해석하여 유효한 JSON 형식으로 포맷하는 동안 선택한 파일로 출력을 보냅니다.
간단한 Bash 파일로도 충분합니다.
이런 python 스크립트를 사용할 수 없나요?
myOutput = subprocess.check_output["ls"]
output = ["+str(e)+" for e in myOutput]
return output
동작하는지는 확인하지 않았습니다만, 사양은 이쪽에서 확인하실 수 있습니다.
꽤 쉬울 거야
$ cat ls2json.bash
#!/bin/bash
echo -n '['
for FILE in $(ls | sed -e 's/"/\\"/g')
do
echo -n \"${FILE}\",
done
echo -en \\b']'
다음으로 다음을 실행합니다.
$ ./ls2json.bash > json.out
하지만 비단뱀은 더 쉬울 것이다.
import os
directory = '/some/dir'
ls = os.listdir(directory)
dirstring = str(ls)
print dirstring.replace("'",'"')
다음은 jq에 의존하지 않는 우아한 원라이너 솔루션입니다.
echo '[ "'"$(echo "$list" | sed ':a;N;$!ba;s/\n/", "/g')"'" ]'
$list
하다
gnu 컬럼 사용(OSX에서는 동작하지 않음)
ls -ldG * --time-style=long-iso | column -t -n "$PWD" -N mod,links,user,size,date,time,name -J
출력:
{
"/home/pouet": [
{"mod":"-rwxr-xr-x", "links":"1", "user":"pouet", "size":"21978", "date":"2022-08-12", "time":"11:47", "name":"file1"},
{"mod":"-rw-r--r--", "links":"1", "user":"pouet", "size":"2634", "date":"2022-06-20", "time":"11:14", "name":"file2"}
]
}
bash를 사용하지 말고 스크립트 언어를 사용합니다.테스트되지 않은 perl의 예:
use JSON;
my @ls_output = `ls`; ## probably better to use a perl module to do this, like DirHandle
print encode_json( @ls_output );
언급URL : https://stackoverflow.com/questions/10234327/convert-bash-ls-output-to-json-array