2017-04-30 4 views
3

디렉토리에있는 모든 파일의 모든 파일 이름을 .txt 파일로 인쇄하고 싶습니다.디렉토리의 파일 목록을 텍스트 파일 (텍스트 파일 자체는 아님)에 인쇄하십시오.

file1.txt 
file2.txt 
file3.txt 

을 나는 ls > output.txt를 사용하여 시도 :

의 내가 3 개 파일과 디렉토리를 가지고 있다고 가정하자.

file1.txt 
file2.txt 
file3.txt 
output.txt 

I 출력을 리디렉션있어 파일의 이름을 인쇄하지 않도록 할 수있는 방법이 있나요 :

것은 내가 output.txt을 열 때 나는이 목록을 찾을 수 있다는 것입니다? 아니면 하나의 디렉토리에있는 파일의 모든 파일 이름을 인쇄 할 수있는 명령이 있습니까?

+1

출력을 다른 파일과 같은 디렉토리에 인쇄해야하는 이유가 있습니까? – Jeremy

+2

@ 제레미 (Jeremy) 나는 그걸로 일하기가 더 쉽다. 그러나 예, 나는 문제를 완전히 피하는 다른 디렉토리에 파일을 만들 수 있습니다. 나는 그것에 대해 생각하지 않았다 – jackscorrow

답변

5
printf '%s\n' * > output.txt 

주 - 그렇다면, 먼저 삭제합니다.

  • printf '%s\n' *은 견고 라인으로 모든 파일과 현재 디렉토리에있는 서브 디렉토리, 라인의 이름을 인쇄 할 수 globbing (filename expansion) 사용합니다. 그 이름이 출력에 포함 하지 그래서

  • 글 로빙는 output.txt 전에이 (문제를 설명 명령이 을 실행하기 전에 아직 발생) 출력 재 지정 > output.txt을 통해 생성됩니다 발생합니다.

  • 또한 블로킹에서의 사용이 generally discouragedls의 사용을 피할 수 있습니다.

1

일반적으로 좋은 결과를 오랫동안 유지해야하는 제작 품질의 스크립트를 작성하는 중에는 ls의 결과를 구문 분석하는 것이 좋지 않습니다. 알이 페이지를 참조하는 이유 : 쉘 ls을 실행하기 전에 (경우 output.txt로) 리디렉션을 배치하기 때문에 Don't parse ls output 당신의 예에서

, output.txtls > output.txt의 출력의 일부입니다. 숨겨진 파일에 출력을 저장 (또는 다른 디렉토리에있는 일반 파일에서) 다음으로 이동,

ls file*txt > output.txt # as long as you are looking for files named that way 

나 :

사건에 대한 올바른 동작을 얻을 수있는 가장 간단한 방법은 것 최종 장소 :

ls > .output.txt && mv .output.txt output.txt 

더 일반적인 솔루션은 grep -v을 사용하는 것입니다 :

ls | grep -vFx output.txt > output.txt 

또는, 당신은 배열을 사용할 수 있습니다 : 파일 이름에 대해 아무것도 가정하지 않고,

files=("$(ls)") 
printf '%s\n' "${files[@]}" > output.txt 
+2

나는 줄의 하나가'output.txt' (틀림없이 이국적인 경우) 인 여러 줄의 파일 이름들에 대해서 여전히 불만을 가지고 있다고 생각한다. 다른 솔루션의 경우 : 단일 요소 배열 대신 문자열 변수를 사용하지 않는 이유는 무엇입니까? 'files = "($ ls)"; printf '% s' "$ files"> output.txt' – melpomene

0

가장 안전한 방법을 bash는 (메모리) 배열이나 임시 파일을 사용하는 것입니다. 임시 파일은 메모리가 필요하지 않으므로 더 안전 할 수 있습니다. 같은 뭔가이 더 기존의 output.txt 파일이 없다는 것을 가정합니다

#!/bin/bash 
tmp=$(tempfile) 
ls > $tmp 
mv $tmp output.txt 
0

ls은 무시 옵션을 가지고 있으며, 우리는 또한 find 명령을 사용할 수 있습니다. 와 사용

  • ls

-I, --ignore

ls -I "output.txt" > output.txt 
ls --ignore "output.txt" > output.txt 
이 동일한 옵션을 무시합니다. 이 옵션은 맨 페이지에서와 같이 쉘 패턴과 일치하는 묵시적 엔트리를 나열하지 않습니다. find에서 find

find \! -name "output.txt" > output.txt 

-name 옵션을 사용

  • 파일/이름이 패턴과 일치하는 디렉토리를 찾습니다. ! -name은 패턴과 일치하는 이름을 제외합니다.

find \! -name "output.txt" -printf '%P\n' > output.txt 

퍼센트 P의 경로 스트립 만 이름을 제공한다.

+1

귀하의 명령은 _GNU_ 유틸리티 (Linux) 사용을 전제로합니다. 'find' 명령이 동등하게되기 위해서는 (a) 재귀를 막기 위해'-maxdepth 1'이 필요하고 (b) 파일 이름의 목록을 정렬해야합니다. – mklement0

+0

내 컴퓨터에 ignore 옵션이 없습니다. 나는 리눅스를 사용하지 않는다. – jackscorrow