sourcecode

bash 'ls' 출력을 json 배열로 변환합니다.

copyscript 2023. 3. 20. 23:25
반응형

bash 'ls' 출력을 json 배열로 변환합니다.

bash 스크립트를 사용하여 출력 포맷이 가능합니까?lsjson 배열로요?유효한 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

반응형