Linux에서 출력 라인 당 하나의 파일 이름을 어떻게 나열합니까?


229

ls -a디렉토리에서 파일 이름을 가져 오는 명령을 사용 하고 있지만 출력은 한 줄에 있습니다.

이처럼 :

.  ..  .bash_history  .ssh  updater_error_log.txt

다음과 같이 새 줄에 각각 파일 이름을 얻으려면 기본 제공 대안이 필요합니다.

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
ls는 사람이 소비 할 수있는 목록을 표시하기위한 것입니다. 다른 목적으로 ls를 사용하는 경우 (예를 들어, 스크립트에서 파일 목록을 가져 와서 반복하는 등) 잘못된 도구를 사용하고있을 것입니다.
Juliano

2
@juliano-실제로 파이썬 스크립트에 사용됩니다. 왜 그것을 잘못된 도구라고 부릅니까?
fixxxer

1
@fixxer ls파이썬으로 파이프 하는 순간 ls내 대답에서 설명한대로 한 줄에 파일 하나가 출력됩니다.
Peter G.

6
@ fixxxer : 그렇다면 실제로 잘못 사용하고 있습니다. 사용자 터미널에서 출력 할 목록을 형식화합니다. 파일 이름의 특수 문자를 대체하고 특수한 의미를 갖는 문자를 생략 할 수 있습니다. 다시 말해 ls 는 사용자에게 목록을 형식화 합니다. 형식화되지 않은 파일 이름을 원합니다. python 'glob'모듈을 사용하지 않는 특별한 이유는 무엇입니까? docs.python.org/library/glob.html 'fnmatch', 'dircache'및 기타도 있습니다.
Juliano

@fixxer 실제로 파이썬에서 한 줄 출력 ls을 출력 python하고 관찰 했습니까?
Peter G.

답변:


430

다음과 같이 -1옵션을 사용하십시오 (소문자 "L"이 아닌 "한"숫자 임).

ls -1a

그러나 먼저 ls지원하십시오 -1. GNU coreutils (표준 Linux 시스템에 설치)와 Solaris는; 하지만 의심하는 경우, 사용 man ls하거나 ls --help또는 설명서를 참조하십시오. 예 :

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

2
+1 (-l 예는 (ELL없는 한)) 그것은 인간이 페이지에 표시하지만 내가로 읽어 봤는데 것은 전체 시간 : 되겠습니까에 대해 -1 나는 몰랐다는
slashmais

@ slashmais-아, 좋은 지적-실수하기 쉽습니다. 나는 대답에서 명확히했다.
Bert F

1
@dty : GNU의 경우,이 문서는 ls --help출력으로 문서화되어 있습니다 ... 항상 설치 ;-)
Tony Delroy

3
Google에서 검색했으며이 linux ls one file per line기사가 최고의 기사였습니다. 선택한 답변이 얼마나 장엄한 지 또는이 답변이 고양이에게 투표하는 것보다 적은 표를 가지고 있다고 믿을 수 없습니다. ls -1ftw.
crantok

3
ls-1출력이 터미널에 연결되지 않은 경우 기본적으로 동작합니다.
codeforester

131

예, ls한 줄에 하나의 파일 이름 만 쉽게 출력 할 수 있습니다 .

ls -a | cat

설명 : 명령 ls은 출력이 터미널 또는 파일 또는 파이프로 출력되는지 감지하여 적절하게 조정합니다.

따라서 ls -a파이썬으로 파이프 하면 특별한 조치없이 작동해야합니다.


2
와, 이거 훌륭하다. 허용 된 답변에 대한 장점-이것은 실제로 Android / adb shell에서 작동합니다- ls일부 제거 된 버전이 지원되지 않는 곳-1
mkilmanas

출력에 ..."파일"이 표시 되지 않도록하려면 어떻게해야 합니까?
matanster

@matanster : 그것은, 당신은 도트 파일을보고 싶습니까? 그렇지 않은 경우 -a 옵션을 삭제하십시오.
Peter G.

29

Ls는 사람이 소비하도록 설계되었으며 출력을 구문 분석해서는 안됩니다 .

쉘 스크립트에는 ls의 출력을 구문 분석하는 것이 원하는 효과를 얻는 가장 간단한 방법 인 몇 가지 경우가 있습니다. ls는 파일 이름에서 비 ASCII 및 제어 문자를 엉망으로 만들 수 있으므로 이러한 경우는에서 파일 이름을 얻지 않아도되는 부분 집합입니다 ls.

파이썬에서는 호출 할 이유가 전혀 없습니다 ls. 파이썬에는 모든 ls기능이 내장되어 있습니다. 사용하여 os.listdir디렉토리의 내용을 나열하고, os.stat또는 os파일의 메타 데이터를 얻을 수 있습니다. os모듈의 다른 기능도 문제와 관련이있을 수 있습니다.


ssh를 통해 원격 파일에 액세스하는 경우 파일 이름을 나열하는 합리적으로 강력한 방법은 sftp를 사용하는 것입니다.

echo ls -1 | sftp remote-site:dir

이것은 한 줄에 하나의 파일 이름을 인쇄하며 ls유틸리티 와 달리 sftp인쇄 할 수없는 문자를 엉망으로 만들지 않습니다. 파일 이름에 줄 바꿈이 포함 된 디렉토리는 여전히 안정적으로 나열 할 수 없지만 거의 수행되지 않습니다 (이는 유용성 문제가 아니라 잠재적 인 보안 문제로 기억하십시오).

파이썬에서 (쉘 메타 문자는 이스케이프해야 함 remote_dir) :

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

보다 복잡한 상호 작용을 보려면 설명서에서 sftp의 배치 모드를 찾으십시오.

일부 시스템 (리눅스, 맥 OS X, 아마도 다른 유닉스,하지만 확실히 Windows)에서 다른 접근 방식과 ssh를 통해 원격 파일 시스템을 마운트하는 것입니다 SSHFS 한 다음 로컬로 작동합니다.


SSH를 통해 원격 컴퓨터에 연결되어 있습니다. 원격 컴퓨터에서 os.listdir과 같은 파이썬 함수를 한 줄로 실행할 수있는 방법을 찾지 못했습니다. 따라서이 질문. 단순히 파일을 나열하는 스크립트를 작성하고 싶지 않습니다. 이 문제를 해결할 다른 방법이 있습니까?
fixxxer

@fixxxer : ssh는 상황을 바꾼다. 원래 질문에서 언급했던 것들이다! sftp가 사용 사례에 적합하다고 생각합니다.
Gilles 'SO- 악마 그만

혼란을 드려 죄송합니다. "command_line"에도 비밀번호를 삽입 할 수있는 방법이 있습니까?
fixxxer

@ fixxxer : 모르겠다 .ssh의 저자는 일반 텍스트로 저장된 암호를 찌푸리고 쉽게 만들지 않는 경향이 있습니다. 키 기반 인증을 실제로 설정해야합니다 (웹에 대한 많은 자습서와 superuser.com 에 대한 질문 이 있음).
Gilles 'SO- 악의를 멈춰라

11

당신이 사용할 수있는 ls -1

ls -l 또한 일을 할 것입니다


상단 답변에는 이미 말한 내용이 언급되어 있습니다. 또한 질문은 구체적 ls -l으로 사용해서는 안된다고 말합니다 .
DevX

2

파일 이름에 줄 바꿈이 포함되어 있지 않으면 쉽습니다.

find . -maxdepth 1

이것을 다른 명령으로 파이프하는 경우 파일 이름에 널 바이트가 발생할 수 없으므로 줄 바꿈이 아니라 줄 바꿈 대신 파일 이름을 널 바이트로 구분하는 것이 좋습니다.

find . -maxdepth 1 -print0

널 바이트는 일반적으로 인쇄되지 않으므로 터미널에서 인쇄하면 한 줄로 표시 될 수 있습니다. 일부 프로그램은 다음과 같은 핸들 널 (null)로 구분 된 입력에 특정 옵션 필요가 있습니다 sort'들 -z. 자신의 스크립트도 이와 유사하게 설명해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.