파일 및 디렉터리 목록에서 디렉터리 필터링

파일 및 디렉터리 목록에서 디렉터리 필터링

파일과 디렉터리의 전체 경로 이름이 포함된 파일이 있습니다.

파일 경로만 포함된 목록이 남도록 이 목록에서 디렉터리를 참조하는 모든 경로 이름을 필터링하고 싶습니다.

누구든지 우아한 해결책을 생각할 수 있습니까?

답변1

while IFS= read -r file; do
  [ -d "$file" ] || printf '%s\n' "$file"
done <input_file

유형을 알 수 없는 파일이 인쇄됩니다.목차(또는 디렉토리에 대한 심볼릭 링크). 다른 모든 유형의 파일(일반 파일, 심볼릭 링크(디렉토리 제외), 소켓, 파이프...)은 물론 유형을 확인할 수 없는 파일(예: 파일이 존재하지 않거나 사용자가 사용하지 않는 디렉토리에 있기 때문에)도 유지됩니다. 에 존재하지 않습니다.) 검색 권한이 없습니다.

당신이 의미하는 바에 따라 약간의 변형파일 및 디렉토리별(목차Unix의 여러 유형의 파일 중 하나입니다):

  • 문서존재하다(심볼릭 링크 확인 후) 유형이 아닙니다.목차:

    [ -e "$file" ] && [ ! -d "$file" ] && printf '%s\n' "$file"
    
  • 문서존재하다그리고는정기적인파일(심볼릭 링크 확인 후):

    [ -f "$file" ] && printf '%s\n' "$file"
    
  • 문서존재하다그리고는정기적인심볼릭 링크 확인 전 파일(심볼릭 링크 제외):

    [ -f "$file" ] && [ ! -L "$file" ] && printf '%s\n' "$file"
    
  • 등.

답변2

file각 줄에 다음과 같은 파일 경로가 포함되어 있다고 가정합니다 zsh.

printf '%s\n' ${(f)^"$(<file)"}(N^/)

존재하는 것(존재한다고 말할 수 있는 것)을 인쇄하지만 어떤 유형인지는 확실하지 않습니다.목차( 디렉토리에 대한 심볼릭 링크도 삭제 /하도록 변경되었습니다 -/).

을 언급했으므로 xargsGNU 구현( -d및 )을 사용하고 또는 조건자(예: ) -r로 시작하는 파일 경로가 없다고 가정하면 다음과 같이 할 수 있습니다.-find!

xargs -rd '\n' sh -xc 'exec find "$@" -prune ! -type d' sh < file

(GNU 가정 ) -type로 대체하면 디렉토리에 대한 심볼릭 링크도 제외됩니다.-xtypefind

관련 정보