Linux에서 절대 경로로 파일 목록을 생성하려면 어떻게해야합니까?


304

파일 경로를 입력으로 사용하는 쉘 스크립트를 작성 중입니다.

이러한 이유로 전체 경로가 포함 된 재귀 파일 목록을 생성해야합니다. 예를 들어, 파일 bar경로는 다음과 같습니다.

/home/ken/foo/bar

하지만, 지금까지의 내가 볼 수있는, 모두 lsfind만 상대 경로 목록을 제공합니다 :

./foo/bar   (from the folder ken)

명백한 요구 사항처럼 보이지만 find또는 lsman 페이지 에서 아무것도 볼 수 없습니다 .

절대 경로를 포함하여 셸에서 파일 목록을 생성하려면 어떻게해야합니까?


사용 :find /home/ken/foo/bar -exec ls -ld $PWD/{} \;
Learner

답변:


305

당신이주는 경우에 find시작하는 절대 경로를, 그것은 절대 경로를 인쇄합니다. 예를 들어, 현재 디렉토리에서 모든 .htaccess 파일을 찾으려면 다음을 수행하십시오.

find "$(pwd)" -name .htaccess

또는 쉘 $PWD이 현재 디렉토리로 확장 된 경우 :

find "$PWD" -name .htaccess

find 단순히 해당 경로에서 파일에 대한 상대 경로에 제공된 경로를 앞에 추가합니다.

Greg Hewgill 은 또한 pwd -P현재 디렉토리에서 심볼릭 링크를 해결하려는 경우 사용을 제안했습니다 .


9
심볼릭 링크도 해결하려면을 사용하십시오 pwd -P.
Greg Hewgill

5
이것은 도움이되지만 아래 user431529의 답변이 더 유효하다고 생각합니다. ls -d -1 $PWD/**/*그러나 find $PWDbash에서 테스트 한 것 같습니다
Brian

9
@ 브라이언 왜? find $PWD간단합니다. ls주문은 (당신이 그것을 별칭을하지 않는 한) 복잡하고 다루기 힘든이다. find쉘 glob 확장에 의존하지 않으므로 모든 쉘에서 작동합니다. find또한 훨씬 유연합니다. 모든 파일 또는 모든 디렉토리의 재귀 목록을 얻거나 모든 XML 파일 목록을 원하거나 지난 주에 변경된 모든 파일을 원할 수도 있습니다. 이 모든 것이 가능 find하지만 쉽지는 않습니다 ls.
Matthew Scharley

12
나는 find "`pwd`" -name .htaccess디렉토리 이름에 공백 때문에 사용해야했다
Paulo Casaretto

나는 그것을 얻지 못한다.이 명령은 나에게 파일의 절대 경로를 제공하지는 않지만 목록의 다른 대답은 작업을 수행한다.
Bjørn Otto Vasbotten

202
readlink -f filename 

완전한 절대 경로를 제공합니다. 그러나 파일이 심볼릭 링크 인 경우 최종 확인 된 이름을 얻게됩니다.


8
좋은. 읽기 링크의 BSD 변형 (예 : Mac)에서는 작동하지 않습니다. Mac에서는 gnucoreutils를 사용합니다. 따라서 위의 솔루션에서 작동하는 greadlink를 사용할 수 있습니다.
sheki

12
Mac OS X에서는 안됩니다.
Andrew Lazarus

1
@AndrewLazarus-Mac OS X의 경우 realpath대신 사용
cz

를 통해 bash 도구를 설치 brew install coreutils하면 실행 파일은 다음과 같이 설치됩니다./usr/local/opt/coreutils/libexec/gnubin/readlink
redolent

121

합니다 (DIRS이 사용 /후가 **떠들썩한 파티에 필요한 디렉토리를 제한하기 위해) :

ls -d -1 "$PWD/"**/

현재 디렉토리 바로 아래에있는 파일 및 디렉토리의 경우 이름에 다음이 포함됩니다 ..

ls -d -1 "$PWD/"*.*

이 모든 것 :

ls -d -1 "$PWD/"**/*

여기에서 가져온 http://www.zsh.org/mla/users/2002/msg00033.html

bash에서 **활성화하면 재귀 적 shopt -s globstar입니다.


1
ls -d -1 $ PWD / ** / *는 되풀이되지 않습니다. +1을 되 찾을 수 있기를 바랍니다. 그래도 필요한 깊이마다 ** 할 수 있습니다.
user606723

4
** 연산자는 재귀 globbing 연산자입니다. 지원하는 쉘 (예 : zsh)에서 명령을 사용하면 제대로 작동합니다.
zebediah49

ls -d1 "$ PWD /"{*,.*}도 숨겨진 (도트) 파일을 포착합니다. 나를 위해 대답의 재귀 버전은 하위 폴더의 파일에 대한 절대 경로를 추가하지 않았습니다.
Zael

찾기를 사용해야 할 것 같아요 ...-> bash : / bin / ls : 인수 목록이 너무 깁니다
TelamonAegisthus

30

당신이 사용할 수있는

find $PWD 

bash에서


3
현재 디렉토리의 경로와 그 아래의 모든 파일과 디렉토리가 제공됩니다. 아마도 사람들이 찾고있는 것이 아닐 것입니다.
Bill

18
ls -d "$PWD/"*

이것은 현재 디렉토리 에서만 보입니다 . 공백이 포함 된 경우 "$ PWD"를 인용합니다.


이것은 여전히 ​​유효한 답변이지만 이것이 재귀 적으로 작동하지 않는다는 정보를 포함시키는 것이 좋습니다 (실제로 내가 찾던 것입니다!)
bbbco

1
재귀 사용의 경우 : find. -exec ls -ld $ PWD / {} \;
Learner

10

명령: ls -1 -d "$PWD/"*

이것은 아래와 같이 파일의 절대 경로를 제공합니다.

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt

8

$PWD위의 매튜에 의해 좋은 방법입니다. 파일 만 인쇄하려면 find -type f 옵션을 추가하여 일반 파일 만 검색 할 수 있습니다. 다른 옵션은 디렉토리 등에 대해서만 "d"입니다. 따라서 귀하의 경우에는 .c ext를 가진 파일 만 검색하려는 경우 :

find $PWD -type f -name "*.c" 

또는 모든 파일을 원하는 경우 :

find $PWD -type f

참고 : bash가 별명을 설정하면 $ PWD가 홈 디렉토리에 자동 완성되므로 위 명령에 대한 별명을 작성할 수 없습니다.


실제로 -d는 디렉토리만을 의미하는 것이 아니라 디렉토리를 파일처럼 취급한다는 의미입니다. 따라서 -d / home 인 경우 / home에있는 목록이 아닌 "/ home"이 표시됩니다.
Travis

@ 트래비스 : 그는 ls가 아니라 찾을 수있는 옵션에 대해 이야기하고있었습니다. 그의 경우 "find / -type d"는 그가 말한 것처럼 디렉토리 만 찾을 수있다.
oligofren

6

find 명령에 절대 경로를 지정하면 절대 경로와 함께 결과가 나옵니다. 따라서 Ken 디렉토리에서 다음을 입력해야합니다.

find /home/ken/foo/ -name bar -print    

(상대 경로 대신 find . -name bar -print)

당신은 얻을 것이다 :

/home/ken/foo/bar

따라서 원하는 것을 원 ls -l하고 절대 경로를 반환하도록하려면 find 명령 ls -l이 찾은 모든 것을 실행하도록 지시하면 됩니다.

find /home/ken/foo -name bar -exec ls -l {} ;\ 

참고 : {}와 사이에 공백이 있습니다;

다음과 같은 것을 얻을 수 있습니다 :

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

파일의 위치를 ​​모르는 경우 언제든지 검색 위치를 변경할 수 있습니다. 검색 경로가 "/"로 시작되는 한, 절대 ​​경로가 반환됩니다. 많은 권한 거부 오류가 발생하는 위치 (예 : /)를 검색하는 경우 표준 오류를 리디렉션하여 실제로 찾기 결과를 볼 수 있습니다.

find / -name bar -exec ls -l {} ;\ 2> /dev/null

( 2>Born 및 Bash 쉘의 구문이지만 C 쉘에서는 작동하지 않습니다. 다른 쉘에서도 작동 할 수 있지만 Bourne 및 Bash에서 작동한다는 것만 알고 있습니다).


을 사용하여 여러 개의 인수를 동일한 ls프로세스에 전달할 수 있습니다 -exec ls -ld {} +. ( 목록 디렉토리 내용을 -d갖고 싶지 않을 것입니다 ls). 또는 find에 내장 된을 ls사용하십시오 find ... name bar -ls. 또한 명령 당 하나의 arg에 대해 잘못된 구문이 있습니다. 쉘에서 세미콜론을 인용해야하므로 {} \;.
Peter Cordes

5

fd

사용 fd(대안은 find) 다음 구문을 사용합니다 :

fd . foo -a

.검색 패턴은 어디에 foo있고 루트 디렉토리입니다.

예를 들어 모든 파일을 etc재귀 적 으로 나열 하려면 다음을 실행하십시오 fd . /etc -a.

-a, --absolute-path 절대 대신 상대 경로 확인


2

단지 대안

ls -d "$PWD/"* 

*셸 확장 을 정확히 찾아서

echo "$PWD/"*

동일한 작업을 수행합니다 ( -1공백이 아닌 새 줄로 구분하는 데 사용할 수없는 단점 ).


이것에 대해 더 자세히 설명해 주시겠습니까? 쉘 확장이란 무엇입니까? -1라인별로 구분 하는 방법 ?
Antonio Araujo

@Antonio Araujo, 쉘 확장은 쉘 (예 : bash)이 *를 파일 목록으로 대체합니다-bash 매뉴얼 페이지에서 더 읽을 수 있습니다. -1은 ls 명령 옵션이고 echo는 다른 명령이며 동일한 옵션이 없습니다.
마리 샤

1
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

1

다음은 추가 기간없이 목록을 인쇄하고 파일 일치를 검색하는 방법을 보여주는 예입니다. 도움이 되었기를 바랍니다:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

1

이것은 나를 위해 일했습니다. 그러나 알파벳 순서로 나열되지 않았습니다.

find "$(pwd)" -maxdepth 1

이 명령은 알파벳순과 숨겨진 파일도 나열합니다.

ls -d -1 "$PWD/".*; ls -d -1 "$PWD/"*;


1

시도해 볼 수 있습니다.

for name in /home/ken/foo/bar/*
do
    echo $name
done

당신은 단순히 for루프 echo없이 루프를 사용하여 abs 경로를 얻을 수 있습니다 find.


0

현재 및 하위 디렉토리의 모든 파일 목록이 필요한 경우

find $PWD -type f

현재 디렉토리에만 모든 파일 목록이 필요한 경우

find $PWD -maxdepth 1 -type f

0

이것은 정식 경로를 제공합니다 (symlinks를 해결할 것입니다). realpath FILENAME

심볼릭 링크 자체에 대한 표준 경로를 원하면 다음을 수행하십시오. realpath -s FILENAME


0

대부분의 제안 된 방법이 경로에 공백이 있으면 다른 터미널 명령에서 직접 사용할 수없는 경로가됩니다. 이상적으로는 결과 앞에 슬래시가 붙습니다. 이것은 macOS에서 나를 위해 작동합니다.

find / -iname "*SEARCH TERM spaces are okay*" -print 2>&1  | grep -v denied |grep -v permitted |sed -E 's/\ /\\ /g'

-1

find / -print 이것을 할 것이다


1
안타깝게도 필터링하지 않으면 다른 파일을 표시하는 것과 같은 다른 작업을 수행합니다.
DerMike

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