ls 명령 : 파일 당 한 줄씩 재귀 전체 경로 목록을 얻는 방법은 무엇입니까?


493

반복적 인 한 줄당 경로의 평평한 목록을 추출하려면 어떻게해야합니까?

예를 들어, 전체 경로를 가진 플랫 파일 목록을 원합니다.

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 거의 필요한 것을 수행하지만 경로 조각을 원하지 않고 전체 경로를 원합니다.


또한보십시오 : 나무
dreftymac

답변:


386

정말로를 사용하려면 lsawk를 사용하여 출력 형식을 지정하십시오.

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

5
@dreftymac은 객관적으로 말해서 의도적으로 또는 그렇지 않은 질문에 대한 정답입니다. 네, 아마도 그것은 당신이 그 질문에 대한 정답이 아니었다 희망 작성한 할 수 있습니다. 그리고 당신의 더 큰 요점에 동의하는 동안 : "지혜가 달을 가리킬 때, 바보가 손가락을 바라본다"특히 기준에 모호함이 없을 때 주관성의 영향을 최소화하여 정확성을 평가하는 것은 공정합니다.
lurscher

1
@dreftymac, 투표를 변경하게되어 기쁩니다.하지만 이제 잠겨 있습니다. 투표를 업데이트하려면 질문을 편집해야합니다.
lurscher

7
누군가 위의 awk표현을 설명해 주 시겠습니까?
Mert Nuhoglu

2
이 솔루션은 디렉토리를 생략하지 않습니다 (각 디렉토리는 자체 라인을 얻습니다)
JayB

2
감사. Btw, 빠른 복사 및 붙여 넣기를 위해 이것을 한 줄에두면 좋을 것입니다.
Leo Ufimtsev

567

찾기 사용 :

find .
find /home/dreftymac

파일 만 원하는 경우 (디렉토리, 장치 등 생략) :

find . -type f
find /home/dreftymac -type f

2
이 솔루션에서 "사용" ls과 같은 매개 변수를 사용할 수 --sort=extension있습니까?
n611x007

필요한 문맥 정보를 표시하기 위해 printf 출력을 사용할 수도 있습니다 (예 : find. -type f -printf '% p % u \ n')
xsubira

falg로 형식을 지정할 수 있습니까? 즉. python pprint.pprint (files)
Nathan

72

ls -ld $(find .)

수정 시간별로 출력을 정렬하려는 경우 :

ls -ltd $(find .)


11
-bash : / bin / ls : 인수 목록이 너무 깁니다
jperelli

1
+1은 12106 파일로 저를 위해 일했으며,--sort=extensionls
n611x007

3
감사. 나는 그 (멋지고 짧은) 구문에 대해 스스로 생각하지 않았을 것입니다-나는 find . -name "*" -exec ls -ld '{}' \;(파일 수에 관계없이 작동한다는 것을 사용 했지만) 명령은 더 짧습니다.)
SRG

1
해당 파일이나 디렉토리 그러나 @SRG에 의해 따옴표와 함께 찾을 작동 : LS :하지 액세스 ./System가 할 수있는 파일에 공백이 어디는 NTFS 디스크를 나열하고있어 경우 LS 나를 위해 $ (찾으십시오.) 휴식을 -ld
kuz8

더 짧은 대안은 (필요에 따라)입니다 find . -ls.
IanS

59

다음과 같은 간단한 방법을 시도하십시오.

find "$PWD"

9
find "`pwd`"경로에 공백이나 다른 특수 문자가 포함 된 경우
mustafa.0x

7
이것과 다른 점은 find .무엇입니까? -.-
Salman von Abbas

7
@SalmanPK pwd시작과 같은 절대 경로를 찾으면 절대 경로 가 인쇄됩니다. 그건 그렇고, "이것은 어떻게 다른가? find";-)
yckart

44

가장 좋은 명령은 다음과 같습니다. tree -fi

링크를 사용하지 않고 파일을 사용하려면 >출력에서 제거 해야합니다.

tree -fi |grep -v \>

각 파일의 특성을 알고 싶다면 (예를 들어 ASCII 파일 만 읽으려면) 두 개의 whiles를 사용하십시오.

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

고마워, 난 몰랐어 tree!
Dan Filimon

@Nakilon 가장 가까운 것은 무엇입니까? 출력이 비슷하게 표시됩니까? 짧은 명령으로 유사한 출력을 어떻게 쉽게 표시 할 있습니까?
om01

6
@ om01 : osx에서 brew install treehomebrew를 사용하는 것을 고려하면 어렵습니다
ccpizza

파일을 독점적으로 나열 할 수 없습니다. 항상 디렉토리도 나열합니다. 내가 어떻게 할 수 있습니까?
kommradHomer 2016

이것은 더 높은 등급이어야합니다!
der_grund

44

오, 정말 긴 답변 목록입니다. 그것은 많은 도움이되었고 마침내 내가 찾고있는 내 자신을 만들었습니다.

디렉토리 및 해당 서브 디렉토리의 모든 파일을 나열하려면 다음을 수행하십시오.

find "$PWD" -type f

디렉토리 및 해당 서브 디렉토리의 모든 디렉토리를 나열하려면 다음을 수행하십시오.

find "$PWD" -type d

디렉토리와 하위 디렉토리에있는 모든 디렉토리와 파일을 나열하려면

find "$PWD"

2
확장 프로그램으로 필터링하려면 :find "$PWD" -type f | grep '\.json$'
Killroy

2
grep로 후 처리를 수행 할 필요가 없습니다. find "$ PWD"-type f -name * .json과 같이 find에서 -name을 사용하십시오. 나열된 파일을 삭제하려면 다음을 찾으십시오. find "$ PWD"-type f -name * .json -exec rm {} \; 마찬가지로 복사하려면 rm을 cp 및 대상으로 바꾸십시오. -exec cp {} destination
Godfather

18

나는 전체 경로를 모르지만 -R재귀에 사용할 수 있습니다 . 또는에 구부러지지 않은 경우 할 ls수 있습니다 find *.


16

ls 이외의 외부 명령을 사용하지 않는 경우

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done


알 수없는 옵션 '-1'. 중단 중입니다.
ilw

15
du -a

찾기 / 위치를 사용할 수없는 일부 제한된 기기 셸에 유용합니다.


1
어떻게 파일 크기를 제거 할 수 awk있습니까?
Arnold Roa


10

복잡하게 만들지 마십시오. 방금 이것을 사용하고 아름다운 결과를 얻었습니다.

ls -lR /path/I/need

3
OP는 전체 경로 만 원하고 다른 것은 원하지 않습니다. ls -lR그 목표를 달성하지 못할 것입니다.
codeforester

죄송합니다, 그것은하지 않습니다
Aryeh Beitz

9

미래의 모든 사람들에게 가장 쉬운 방법은 다음과 같습니다.

du

그러나 각 폴더에 포함 된 내용의 크기도 표시됩니다. awk를 사용하여 폴더 이름 만 출력 할 수 있습니다.

du | awk '{print $2}'

편집-미안, 내 나쁜. 폴더 만 필요하다고 생각했습니다. 미래의 누군가가 어쨌든 필요할 때를 대비하여 여기에 남겨 두겠습니다.


흥미 롭습니다. Google에서 제안한 것과 같이 내가 알고 싶지 않은 것을 보여주기 때문입니다. 각 파일이 얼마나 많은 공간을 차지하는지 알고 싶습니다.
Jake Toronto


9

평평한 목록을 얻는 가장 좋은 방법은 다음과 같습니다.

find -D tree /fullpath/to-dir/ 

(또는 txt 파일로 저장하기 위해)

find -D tree /fullpath/to-dir/ > file.txt

3
Mac OS 10.13.3에서 시도했습니다. find: illegal option -- D
Jayant Bhawal


6

다음은 디렉토리 이름을 보여주는 부분 답변입니다.

ls -mR * | sed -n 's/://p'

설명:

ls -mR * ':'로 끝나는 전체 디렉토리 이름을 나열한 다음 해당 디렉토리의 파일을 개별적으로 나열합니다.

sed -n 's/://p' 콜론으로 끝나는 라인을 찾고 콜론을 제거하고 라인을 인쇄합니다

디렉토리 목록을 반복함으로써 디렉토리도 찾을 수 있어야합니다. 여전히 작업 중입니다. xargs를 통해 와일드 카드를 얻는 것은 어려운 일입니다.


좋은 답변 .. 정확히 내가 필요한 것!
Selvin

5

ls 디렉토리 끝에 와일드 카드를 추가하면 전체 경로가 적용됩니다. 지금 당신은 이것을 가지고 있습니다 :

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

대신이 작업을 수행 할 수 있습니다.

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

불행히도 이것은 재귀 디렉토리의 전체 경로를 인쇄하지 않으므로 찾고있는 전체 솔루션이 아닐 수도 있습니다.


또한 불행하게도 와일드 카드를 사용하여 sudo ls를 수행 할 수 없습니다 (와일드 카드가 일반 사용자로 확장 되었기 때문에).
Andrew Lorien

4

내가 보는 많은 답변. 이것은 내 것이며, Mac에서 작업하는 경우 매우 유용하다고 생각합니다.

"번들"파일 ( .app , .rtfd , .workflow 등) 이 있다는 것을 확신합니다 . 그리고 Finder의 창을 보면 단일 파일처럼 보입니다. 그러나 그들은 아닙니다. 그리고 $ ls또는 $ find디렉토리로 볼 ... 그래서를, 당신은뿐만 아니라 자신의 내용을 나열 필요하지 않는 한, 나를 위해이 작품 :

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

물론 이것은 작업 디렉토리에 대한 것이며 다른 번들의 확장명을 추가 할 수는 있지만 항상 /뒤에 추가하십시오 . 또는가없는 번들 인 경우 다른 확장 프로그램 /입니다.

오히려 " .lpdf/"(다국어 pdf)가 흥미 롭습니다 . .pdfFinder 에는 보통 " "확장자 (!!)가 없거나 없습니다. 이 방법으로 당신은 이것을 위해 (또는 단지 1 개의 파일을 계산합니다) pdf많은 것들이 아닙니다 ...


4

ls -lR 당신이 찾고 있던 것, 또는 내가했던 것입니다. 건배


OP는 전체 경로 만 원하고 다른 것은 원하지 않습니다. ls -lR그 목표를 달성하지 못할 것입니다.
Hadrien TOMA

3

디렉토리가 상대 경로로 전달 된 경우 find를 호출하기 전에 디렉토리를 절대 경로로 변환해야합니다. 다음 예제에서 디렉토리는 스크립트에 첫 번째 매개 변수로 전달됩니다.

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory

시스템에서 readlink할 수있는 경우directory=$(readlink -e $1)
추후 공지가있을 때까지 일시 중지되었습니다.

사실이지만 cd / pwd 조합은 모든 시스템에서 작동합니다. readlinkOS X 10.5.8에서는 -e 옵션을 지원하지 않습니다.
John Keyes

3
tar cf - $PWD|tar tvf -             

느리지 만 재귀 적으로 작동하며 디렉토리와 파일을 모두 인쇄합니다. 다른 모든 정보 / 디렉토리없이 파일 이름을 원하면 awk / grep으로 파이프 할 수 있습니다.

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

2
tar cvf / dev / null $ PWD
RuleB

2

@ ghostdog74 : 귀하의 솔루션에 약간의 조정.
다음 코드는 전체 절대 경로로 파일을 검색하는 데 사용할 수 있습니다.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

1

파일 이름을 알고 있었지만 디렉토리도 원했습니다.

$ PWD 찾기 | fgrep 파일 이름

Mac OS 10.12.1에서 완벽하게 작동

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