파일과 디렉터리의 전체 경로 이름이 포함된 파일이 있습니다.
파일 경로만 포함된 목록이 남도록 이 목록에서 디렉터리를 참조하는 모든 경로 이름을 필터링하고 싶습니다.
누구든지 우아한 해결책을 생각할 수 있습니까?
답변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^/)
존재하는 것(존재한다고 말할 수 있는 것)을 인쇄하지만 어떤 유형인지는 확실하지 않습니다.목차( 디렉토리에 대한 심볼릭 링크도 삭제 /
하도록 변경되었습니다 -/
).
을 언급했으므로 xargs
GNU 구현( -d
및 )을 사용하고 또는 조건자(예: ) -r
로 시작하는 파일 경로가 없다고 가정하면 다음과 같이 할 수 있습니다.-
find
!
xargs -rd '\n' sh -xc 'exec find "$@" -prune ! -type d' sh < file
(GNU 가정 ) -type
로 대체하면 디렉토리에 대한 심볼릭 링크도 제외됩니다.-xtype
find