폴더의 파일 이름을 테이블 형식의 파일로 인쇄하는 방법

폴더의 파일 이름을 테이블 형식의 파일로 인쇄하는 방법

폴더에 일부 파일이 있고 텍스트가 다음이 아닌 것처럼 표 형식으로 file.txt에 해당 이름을 인쇄하고 싶습니다. 이를 달성하기 위한 명령이 있습니까?

dd1.txt dd2.txt dd3.txt dd5.txt

답변1

하위 디렉터리로 재귀할 필요가 없다고 가정하면 다음과 같습니다.

printf '%s\n' * | paste -d ' ' -s - >other/path/file.txt

그러면 파일의 한 줄에 현재 디렉터리에 표시되는 모든 파일 이름이 나열됩니다 other/path/file.txt.

file.txt현재 디렉터리에 쓰면 해당 파일 이름이 출력의 일부가 되기 때문에 다른 디렉터리의 파일에 쓰기로 선택했습니다 . 분명히, 먼저 출력 파일 이름이 자유롭게 사용 가능한지 확인하십시오.

printf유틸리티는 일반적으로 셸에 내장된 유틸리티이므로 *수천 개의 이름으로 확장될 수 있습니다(참고 printf:아니요shOpenBSD에 내장된 유틸리티이지만 ksh). 유틸리티는 한 줄에 하나의 파일 이름을 생성하지만 ls일부 경우에 발생할 수 있는 이름 자체의 형식을 방해하지 않습니다 .

paste명령은 줄바꿈으로 구분된 이름 목록을 가져와서 공백을 사이에 두고 한 줄에 표시합니다. -d필요한 경우 이 옵션을 사용하여 구분 기호를 쉽게 변경할 수 있습니다.

이렇게 하면 개행 문자가 포함된 파일 이름을 올바르게 처리할 수 없으며 생성된 목록에서 공백이 포함된 파일 이름을 추출할 수도 없습니다.

답변2

$ files=(*)
$ echo "${files[@]}"
dd1.txt dd2.txt dd3.txt dd5.txt

답변3

셸을 사용하여 현재 디렉터리에 숨겨져 있지 않은 파일의 이름(어휘순으로 정렬되고 공백 문자로 구분되며 개행 문자로 종료됨)을 인쇄하려면 zsh다음을 수행할 수 있습니다.

print -r - *(N)

또는:

echo -E - *(N)

쉘 포함 fish:

set files *; echo -E -- $files

쉘 포함 ksh93:

print -r - ~(N)*

쉘 포함 yash:

(set -o nullglob; ECHO_STYLE=raw echo *)

, 및 의 경우 및 옵션도 활성화되지 않은 bash경우 (일부 배포에서는 기본적으로 ):posixxpg_echobash

(shopt -s nullglob; set -- *; echo -En "$@"$'\n')

또는:

POSIXly(Bash(POSIX 모드가 아님) 및 zsh(POSIX 모드에서만)에서도 작동함):

set -- [*] *
case "$1$2" in
  ('[*]*') printf '\n';;
  (*) 
    printf %s "$2"
    shift 2
    printf ' %s' "$@"
esac
printf '\n'

printf( 현재 작업 디렉토리에 많은 수의 파일이 있는 경우 내장되지 않은 쉘 구현에서는 이것이 실패할 수 있음을 명심하십시오 ).

현재 작업 디렉토리에 숨겨지지 않은 파일이 없거나 읽을 수 없는 경우 이들 모두는 빈 줄을 인쇄합니다. 어떤 경우에도 파일 이름에 개행 문자가 포함되어 있지 않으면 출력에는 한 줄만 포함됩니다.

표준 셸을 사용하여 이러한 간단한 작업을 수행하는 것이 얼마나 어려울 수 있는지는 놀랍지만 여기서는 Unix 셸 및 유틸리티의 몇 가지 잘못된 설계를 해결해야 합니다.

  • echo명령(공백으로 구분된 인수를 출력하는 명령)은 이식하기 가장 어려운 명령 중 하나이며 표준 구현은 쉽게 비활성화할 수 없는 방식으로 필요한 것보다 더 많은 작업을 수행합니다.
  • POSIX sh 사양을 포함한 많은 쉘은 불일치 시 확장되지 않은 글로브를 남깁니다.
  • 이는 ls파일을 나열하는 명령이므로 해당 목록을 사후 처리 가능한 형식으로 생성할 수 있는 방법이 없습니다.
  • 이 줄은 할 수 없습니다포함하다임의의 임의의 바이트 시퀀스(이것은 Unix 유틸리티는 물론 Unix뿐만 아니라 대부분의 시스템에서 텍스트 줄을 나타내는 것입니다).

관련 정보