특정 날짜에 생성된 파일을 찾도록 설계된 Bash 스크립트가 있습니다. 작동 방식은 다음과 같습니다.
#!/bin/bash
LOCATION="/tmp/testfiles"
DATE="Jan 10"
COMMAND="ls -l ${LOCATION} | grep '${DATE}'"
for FILE in `eval $COMMAND`
do
echo $FILE
done
내가 예상했던 파일을 찾고 있습니다.
-rw-rw-rw- 1 root root 9485 Jan 10 10:00 test01.log
그러나 bash for 루프는 ls -l 명령의 모든 필드를 반복하므로 다음과 같이 끝납니다.
-rw-rw-rw-
1
root
root
9485
Jan
10
10:00
test01.log
이것이 내가 원하지 않는 것입니다. 모든 필드를 반복하는 것을 방지하기 위해 ls -l 명령에서 파일 이름을 추출할 수 있습니까?
이 경우 grep이 작동하려면 날짜를 알아야 하기 때문에 ls를 사용할 수 없습니다.
추신. 명령을 변수에 저장하는 것이 권장되지 않는다는 것을 알고 있지만 지금은 이것이 필요하며 나중에 변경할 수 있습니다.
답변1
그러면 지정된 날짜 사이에 수정된 파일의 모든 경로가 인쇄됩니다.
find . -type f -newermt '2018-01-17' ! -newermt '2018-01-18'
파일 이름에 공백, 탭, 줄 바꿈 및 와일드카드가 포함되어 있지 않은 경우(아직 수정하지 않은 경우 $IFS
) 스크립트에서 사용할 때 작동합니다.
FILES=$(find /your/path -type f -newermt '2018-01-17' ! -newermt '2018-01-18')
for file in $FILES; do
echo "${file}"
done
파일 이름 대신 경로를 인쇄합니다.
이러한 파일로 수행하려는 작업에 따라 find -exec command
.
답변2
ls
쉘 스크립트에서는 어떤 형태의 명령 출력도 사용하지 않는 것이 거의 보편적으로 권장됩니다. ls -1
대신 (숫자, "1")을 사용하더라도 ls -l
공백 등이 포함된 파일 이름을 처리해야 합니다.
대신 보안 인쇄 옵션 및 특정 파일이 생성되는 시기를 제한하는 옵션 find
과 함께 이 명령을 사용하세요.-print0
-ctime
답변3
이 작업을 안전하게 수행하려면 구문 분석을 하지 말고 가능하면 사용을 피해야 ls
합니다 . eval
이 제안에서는 파일 이름의 공백과 이상한 문자로부터 코드를 보호합니다.
date="Jan 10 2017"
find -type f -newermt "$date" \! -newermt "$date + 1 day" -printf '%P\0' |
while IFS= read -r -d $'\000' f;
do
echo ">> $f <<"
done
파일 이름만 캡처하려는 경우 루프가 필요하지 않으며 후행 없이 while read
사용할 수도 있습니다 .find ... -printf "%P"
\0