echo를 사용하여 한 줄에 하나의 파일 인쇄

echo를 사용하여 한 줄에 하나의 파일 인쇄

한 줄에 파일/디렉토리 목록을 인쇄하는 방법은 무엇입니까 echo?

공백을 개행 문자로 바꿀 수 있지만 파일 이름에 공백이 포함되어 있으면 작동하지 않습니다.

$ echo small*jpg
small1.jpg small2.jpg small photo 1.jpg small photo 2.jpg

$ echo small*jpg | tr ' ' '\n'
small1.jpg
small2.jpg
small
photo
1.jpg
small
photo
2.jpg

를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 ls -d1를 사용하여 이 작업을 수행하는 것도 가능합니까 echo?

답변1

echoprintf어떠한 경우에도 임의의 데이터를 출력하는 데 사용할 수 없습니다.echo이것은 텍스트 출력을 위한 손상된 유틸리티를 POSIX로 대체합니다.

printf '%s\n' small*jpg

다음과 같이 할 수도 있습니다.

printf '%s\0' small*jpg

목록을 NUL로 구분된 레코드로 출력합니다(예를 들어 GNU를 사용하여 사후 처리할 수 있습니다 xargs -r0. 개행 문자는 파일 이름의 공백이나 문자만큼 유효하다는 점을 기억하세요).

POSIX가 등장하기 전에는 ksh를 대체하는 유틸리티가 printf있었습니다 . zsh가 이를 복사하고 한 줄에 하나의 인수를 인쇄하는 옵션을 추가했습니다.printecho-l

print -rl -- small*jpg

ksh93은 인쇄와 유사한 -f옵션을 추가합니다. 또한 복사되었지만 다른 ksh 구현에서는 복사되지 않았습니다.printprintfzsh

print -f '%s\n' -- small*jpg

인수가 제공되지 않으면 이러한 모든 함수는 여전히 빈 줄을 인쇄합니다. 더 나은 접근 방식 println은 다음과 같은 함수로 작성하는 것입니다.

println() {
  [ "$#" -eq 0 ] || printf '%s\n' "$@"
}

존재하다 zsh:

println() print -rC1 -- "$@"

답변2

echo인수로 받은 문자열을 구분하려면 공백만 사용하세요.

귀하의 질문이 태그되었으므로, 내용은 다음과 같습니다 help echo( bash강조):

ARG 표시,단일 공백 ​​문자로 구분됨그런 다음 표준 출력에서는 개행 문자가 옵니다.

다른 구현 문서에서도 비슷한 설명을 찾을 수 있습니다. 예를 들어echo~에서coreutils, GNU/Linux에서 찾을 수 있습니다:

echo각 문자열 사이에 공백을 두고 마지막 문자열 뒤에 줄 바꿈을 추가하여 주어진 각 문자열을 표준 출력에 씁니다.

파일 이름을 별도의 줄에 인쇄 하려면 echo단일 문자열로 제공해야 합니다.

$ touch "small1.jpg" "small2.jpg" "small photo 1.jpg" "small photo 2.jpg"
$ (set -- small*.jpg; IFS='
'; echo "$*")
small1.jpg
small2.jpg
small photo 1.jpg
small photo 2.jpg

여기서는 특수 매개변수의 동작을 활용합니다 *. 큰따옴표 안에는 다음과 같이 확장됩니다.한 단어여기서 위치 인수 배열의 요소는 IFS변수의 첫 번째 문자(개행 문자로 설정)를 사용하여 연결됩니다.

(...)구문은 서브쉘 환경에서 명령을 실행하는 데 사용됩니다. 일반적으로 우리는 메인 쉘에 영향을 미치고 싶지 않습니다.

하지만 다음 echo에 설명된 대로 모든 제한사항은 여전히 ​​적용됩니다.스티븐의 대답이므로 이 경우에는 사용하지 않는 것이 좋습니다.

관련 정보