공백을 처리하면서 찾기 파일에 나열된 경로를 어떻게 사용합니까?

공백을 처리하면서 찾기 파일에 나열된 경로를 어떻게 사용합니까?

이라는 파일에 경로 목록이 있습니다 pathlist.txt. 다음과 같습니다.

/home/abc/dirA
/home/abc/dirB
/home/abc/dir with space
/home/abc/dirX

각 경로에서 모든 파일을 찾아야 합니다. 다음은 작동하지만 공백이 없는 경로에만 적용됩니다.

find $(tr '\n' ' ' < pathlist.txt) -type f -printf "%p, %AY-%Am-%Ad \n"

IFS=$'\n'설정 과 몇 가지 실험을 시도했지만 xargs성공하지 못했습니다. find가 공백(및 기타 특수 문자)이 포함된 경로를 허용하는지 확인하는 방법에 대한 제안 사항이 있습니까?

답변1

한 가지 접근 방식은 다음과 같습니다 bash.

readarray -t a < pathlist.txt
find "${a[@]}" -type f ....

답변2

xargs의 GNU 구현을 사용하는 경우 이 -d옵션을 사용하여 구분 기호(이 경우 개행 문자)를 설정할 수 있습니다.

데모:

xargs -d '\n' -I{} printf '<<%s>>\n' '{}' <<END
abc def
unix and linux
END
<<abc def>>
<<unix and linux>>

따라서 귀하의 명령에 따라 첫 번째 시도는 다음과 같습니다.

xargs -a pathlist.txt -d '\n' -I{} -- \
   find '{}' -type f -printf "%p, %AY-%Am-%Ad \n"

여기에는 두 가지 문제가 있습니다.

  • 교체에서 알 수 있듯이 이제 여러 find인스턴스가 실행됩니다.xargs -I-L1
  • 개행 문자가 포함된 파일 이름에는 여전히 문제가 있습니다.

GNU를 사용하여 쉘 이스케이프 문자열을 생성하면 printf %q첫 번째 문제를 해결할 수 있습니다.

find $(xargs -a pathlist.txt -d '\n' printf '%q\n') \
    -type f -printf "%p, %AY-%Am-%Ad \n"

두 번째 경우에는 구분 기호로 간주 \0하고 xargs -0이를 구분 기호로 사용합니다.

답변3

readarray방법은 가장 간단하지만 사용 중인 셸이 이를 지원하지 않는 경우 모든 POSIX 셸에서 작동하는 다음 방법을 시도해 볼 수 있습니다.

while IFS= read -r pathname; do
    find "$pathname" -type f
done < pathlist.txt

관련 정보