ls -l 결과에서 파일 이름을 추출하는 Bash 스크립트

ls -l 결과에서 파일 이름을 추출하는 Bash 스크립트

특정 날짜에 생성된 파일을 찾도록 설계된 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

관련 정보