답변:
첫 번째 옵션과 비슷하지만 후행 구분 기호를 생략합니다.
ls -1 | paste -sd "," -
paste
는 -
적어도 my에서 (표준 입력)을 기본값으로 가져옵니다 paste (GNU coreutils) 8.22
.
"\0"
, 그래서 paste -sd "\0" -
나를 위해 일한!
편집 : 단순히 " ls -m "구분자를 쉼표로 사용하려면
아, 힘과 단순성!
ls -1 | tr '\n' ','
"쉼표를 변경 , 당신이 원하는대로에". 여기에는 "후행 쉼표"가 포함됩니다.
\n
도 대체됩니다.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
최종 마커 문자 좀 더 효율적으로 될 수있다 :ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
after를 사용하면 tr
마지막 기호를 제거하는 것만으로도 불합리한 것 같습니다. 나는 다음과 같이 간다ls -1 | tr '\n' ',' | head -c -1
마지막 쉼표를 개행 문자로 바꿉니다.
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m
화면 너비 문자에 개행 문자를 포함합니다 (예 : 80 번째 문자).
대부분 배쉬 ( ls
외부 만 ) :
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Bash 4에서 readarray
(aka mapfile
) 사용
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
제안에 대해 gniourf_gniourf에게 감사합니다.
mapfile
(Bash ≥4)를 다음과 같이 사용하십시오 mapfile -t files < <(ls -1)
. 와 함께 바이올린을 칠 필요가 없습니다 IFS
. 그리고 더 짧습니다.
IFS
필드를 결합하는 데 사용할 수 있습니다 saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
.. 또는 하나 이상의 문자가있는 구분 기호를 원하는 경우 다른 방법을 사용하십시오.
이건 대단해
ls -1 | awk 'ORS=","'
ORS는 "출력 레코드 구분 기호"이므로 이제 행이 쉼표로 결합됩니다.
" OR "
)
설정 IFS
과 사용의 조합은 "$*"
원하는 것을 할 수 있습니다. 서브 쉘을 사용하고 있으므로이 쉘의 $ IFS를 방해하지 않습니다
(set -- *; IFS=,; echo "$*")
출력을 캡처하려면
output=$(set -- *; IFS=,; echo "$*")
set
작동 방식 에 대한 추가 정보 가 있습니까? 저에게 약간 부두처럼 보입니다. 얕게 살펴보면 man set
많은 정보 를 얻지 못했습니다.
set
여러 인수를 제공하지만 옵션은 제공 하지 않으면 위치 매개 변수 ($ 1, $ 2, ...)를 설정합니다. 첫 번째 인수 (또는이 경우 파일 이름)가 대시로 시작되는 경우 --
보호해야 set
합니다. 의 --
옵션 설명을 참조하십시오 help set
. 위치 매개 변수가 물건 목록을 처리하는 편리한 방법을 찾습니다. 나는 또한 이것을 배열로 구현할 수 있었다 :output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
당신에게 말할 것이다 set is a shell builtin
. 따라서 man set
도움이되지는 않지만 그렇게 help set
할 것입니다. 답 : "-나머지 인수를 위치 매개 변수에 지정하십시오."
set -- *
. *
한 레벨의 확장을 지연 시키면 서브 쉘 없이도 올바른 출력을 얻을 수 있습니다 IFS=',' eval echo '"$*"'
. 물론 위치 매개 변수가 변경됩니다.
ls
일반적으로 구문 분석 은 권장되지 않으므로 다음 과 같이 더 나은 대안을 사용하는 것이 좋습니다find
.
find . -type f -print0 | tr '\0' ','
또는 find
and 를 사용 하여 paste
:
find . -type f | paste -d, -s
파일 시스템과 관련이없는 여러 줄을 일반적으로 결합 하려면 Unix 명령 줄에서 간결하고 이식 가능한“결합”을 확인하십시오 .
바퀴를 재발 명하지 마십시오.
ls -m
정확히 그렇습니다.
ls -m
하고 tr
제거하기ls -m | tr -d ' '
sed 's/, /,/g
그냥 강타
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
@camh 는 후미하지 않습니다 .
bash
그리고 gnu coreutilsprintf
printf -v
bash에서만 작동 하지만 제시된 답변은 많은 쉘 유형에서 작동합니다.
|
두 줄을 모두 사용 한다면 후행을 제거합니다 printf -v mystring "%s|" * ; echo ${mystring%|}
.
이 명령은 PERL 팬을위한 것입니다.
ls -1 | perl -l40pe0
여기 40은 공간에 대한 8 진 ASCII 코드입니다.
-p는 한 줄씩 처리하고 인쇄합니다.
-l은 후행 \ n을 우리가 제공하는 ASCII 문자로 대체합니다.
-e는 명령 행 실행을 PERL에 알리는 것입니다.
0은 실제로 실행할 명령이 없음을 의미합니다.
perl -e0은 perl -e ''와 동일합니다
답변이 이미 존재하는 것 같습니다.
네가 원한다면
a, b, c
형식ls -m
( Tulains Córdova 's answer )을 사용하십시오.
또는 원하는 경우 a b c
형식ls | xargs
( Chris J의 대답의 단순화 된 버전 )을 사용하십시오.
아니면 같은 다른 구분하려면 |
사용을, ls | paste -sd'|'
(의 응용 프로그램 아르 템의 대답 )
majkinetor의 답변 위에 덧붙여서, 여기에 후행 구분 기호를 제거하는 방법이 있습니다 (아직 그의 대답으로 주석을 달 수 없기 때문에).
ls -1 | awk 'ORS=","' | head -c -1
구분 기호로 계산되는 후행 바이트 수를 제거하십시오.
다중 문자 구분 기호 + 다른 장점을 사용할 수 있기 때문에이 방법이 마음에 듭니다 awk
.
ls -1 | awk 'ORS=", "' | head -c -2
편집하다
Peter가 알 수 있듯이 기본 MacOS 버전의 head에서는 음의 바이트 수가 지원되지 않습니다. 그러나 이것은 쉽게 고칠 수 있습니다.
먼저을 설치하십시오 coreutils
. "GNU 핵심 유틸리티는 GNU 운영 체제의 기본 파일, 셸 및 텍스트 조작 유틸리티입니다."
brew install coreutils
MacOS에서 제공하는 명령은 접두사 "g"와 함께 설치됩니다. 예를 들어gls
.
이 작업을 수행하면 ghead
음수 바이트 수를 사용하거나 더 나은 별칭을 사용할 수 있습니다 .
alias head="ghead"
sed 방법,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
참고 :
복잡성이 선형이며 모든 라인이 sed의 패턴 공간에 추가 된 후에 한 번만 대체됩니다.
@AnandRajaseka의 대답 과 here 와 같은 다른 유사한 대답 은 O (n²)입니다. sed는 새 줄이 패턴 공간에 추가 될 때마다 대체해야합니다.
비교하기 위해서,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
설명:
-e
-실행할 명령을 나타냅니다
:a
.-레이블
/$/N
입니다. 현재 및 (N) ext 라인에 대한 일치 범위를 정의합니다
s/\n/\\n/;
.-모든 EOL을\n
ta;
하는 경우 -goto 레이블 a로
내 블로그 에서 가져 왔습니다 .
후행 슬래시 처리 기능이있는 Quick Perl 버전 :
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
설명하기:
ls -1 | paste -s -d ":" -
확실하지 그 페이스트의 모든 버전과 보편적 인 경우