파일 이름과 절대 경로를 한 줄로 얻는 방법은 무엇입니까?

파일 이름과 절대 경로를 한 줄로 얻는 방법은 무엇입니까?

아래와 같이 각각의 절대 경로를 사용하여 폴더의 모든 파일을 한 줄씩 나열하고 싶습니다.

filename1  /home/.../file1  
filename2 /home/.../file2  
filename3 /home/.../file3  

시도했지만 find $(pwd) -type f경로만 제공합니다.

답변1

GNU 사용 find:

find "$PWD" -type f -printf '%f %h/%f\n'
  • %f모든 선행 디렉터리 파일 이름을 제거합니다(마지막 요소만).
  • %h파일 이름의 선행 디렉터리(마지막 요소를 제외한 모든 요소) 파일 이름에 슬래시가 포함되어 있지 않으면(현재 디렉터리에 있기 때문에) %h 지정자는 "."으로 확장됩니다.

답변2

표준 find:

find "$PWD" -type f -exec sh -c '
    for pathname do
        printf "%s\t%s\n" "${pathname##*/}" "$pathname"
    done' sh {} +

그러면 현재 디렉터리 안이나 아래에 있는 모든 파일이 탭으로 구분된 목록이 인쇄됩니다. 첫 번째 열에는 파일의 파일 이름이 포함되고 두 번째 열에는 $PWD현재 디렉터리(검색 경로의 절대 경로)를 기준으로 한 파일의 경로 이름이 포함됩니다.

이는 발견된 경로 이름을 선호하는 형식으로 간단히 이름을 출력하는 짧은 인라인 스크립트에 일괄 공급하여 수행됩니다. 매개변수 교체는 ${pathname##*/}해당 값으로 확장되고 $pathname마지막 값 이전의 모든 항목을 제거합니다 /.

개행 문자가 포함된 파일 이름은 여러 줄에 나타나며 탭이 포함된 파일 이름을 올바르게 구별하기가 어렵습니다. 결과가 구문 분석이 아닌 보기용이라고 가정하면 아마도 괜찮을 것입니다.

답변3

안녕하세요, 감사합니다언급하다fselect!

이상한 파일 이름 문제는 새로운 것이 아닌 것 같습니다. 파일 이름과 경로가 같은 줄에 있는지(그 안에 포함되어 있는지)조차 알 수 없습니다 \n. 이러한 문제를 해결하려면 fselect지원INTO옵션.

가장 간단한 변형은 INTO LIST추가 구문 분석을 위한 것입니다 xargs. INTO JSON보다 정교한 처리에 관심이 있을 수 있습니다.

답변4

그리고 zsh:

for f (**/*(DN)) print -r -- $f $f:P

$f:Prealpath()파일에 대한 표준 절대 경로로 확장하는 것과 같습니다 (경로 구성 요소의 모든 기호 링크를 대상으로 반복적으로 확장).

관련 정보