echo* | xargs -n1 echo 한 줄씩 목록을 작성하는 더 짧고 우아한 방법이 있습니까?

echo* | xargs -n1 echo 한 줄씩 목록을 작성하는 더 짧고 우아한 방법이 있습니까?

이 작업을 수행하면 ls출력이 열에 표시되지만 출력은 한 열, 행 단위, 행당 하나의 항목에만 있어야 합니다.

그래서 내가 생각할 수 있는 유일한 방법은 다음과 같습니다.

echo * | xargs -n1 echo

이것이 그것을 구현하는 표준 방법입니까, 아니면 단지 나쁜 스타일입니까?

답변1

xargs에 관한 일반적인 조언은 xargs를 사용하지 않는 것입니다 xargs. 해당 입력 형식은 일반적인 도구에서 지원되지 않습니다.

xargs 사용법의 다음 레벨은 use 이며 xargs -0, 여기서 입력은 널로 구분됩니다. 그러나 귀하의 경우 xargs는 어쨌든 의미가 없습니다.

ls한 줄에 하나의 파일만 있도록 하려면 를 사용 하세요 ls -1. ls이 명령은 출력이 파이프나 파일로 전송될 때 항상 한 줄에 하나의 파일을 넣습니다. plain은 출력이 터미널로 전달될 때 ls열의 파일 이름을 정렬 하지만 ls -1그렇지 않습니다.

이는 단어 목록이 있고 한 줄에 한 단어씩 인쇄하려는 경우에 작동합니다 printf '%s\n'. echo공백 대신 각 요소 뒤에 줄 바꿈을 인쇄하고 백슬래시나 대시 처리 위험이 없다는 점을 제외 하면 와 유사하게 작동합니다 .

printf '%s\n' *          # prints the names of the files in the current directory
printf '%s\n' "$@"       # prints the positional arguments
printf '%s\n' "${a[@]}"  # prints the element of the array `a`

답변2

이는 일반이 나쁜 모든 이유로 좋지 않습니다 xargs. 즉, 공백이나 백슬래시가 포함된 파일 이름을 손상시킵니다.

$ touch "foo bar"
$ echo * | xargs -n1 echo
foo
bar

echo또한 각 파일에 대해 (외부) 명령의 복사본을 실행합니다.

대부분의 쉘에서는 이것을 사용하여 printf "%s\n" *목록을 얻을 수 있습니다. 또는 ls -1.

하지만 문제는 파일 목록으로 무엇을 하시겠습니까? 그냥 보거나 스크립트에서 사용하시겠습니까? 후자의 경우 아마도 다음을 사용하는 것이 더 나을 것입니다.

for f in * ; do something with "$f" ; done

또는 일부 변형find ... -exec somecmd {} +

답변3

파일 이름에 특수 문자가 포함되어 있으면 원하는 작업이 수행되지 않습니다.

$ touch 'name
with newline' 'other name\nwith newline'
$ echo * | xargs -n1 echo
name
with
newline
other
name
with
newline

파일을 나열하려는 경우에만 사용할 수 있습니다 ls -1. 그렇지 않으면 플래그 find와 함께 사용하세요.-exec

관련 정보