이라는 파일에 경로 목록이 있습니다 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