이 작업을 수행하면 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