이름에 주어진 입력 날짜보다 작거나 같은 날짜 값이 포함된 파일을 가져옵니다.

이름에 주어진 입력 날짜보다 작거나 같은 날짜 값이 포함된 파일을 가져옵니다.

내 폴더 중 하나에 다음 형식의 파일이 포함되어 있습니다.

3_20150412104422154033.txt
3_2015041211022775012.txt
3_20150412160410171639.txt
3_20150412160815638933.txt
3_20150413161046573097.txt
3_20150413161818852312.txt
3_20150413163054600311.txt
3_20150413163514489159.txt
3_2015041321292659391.txt
3_20150414124528747462.txt
3_20150414125110440425.txt
3_20150414134437706174.txt
3_20150415085045179056.txt
3_20150415100637970281.txt
3_20150415101749513872.txt

날짜 값이 입력 날짜 값보다 작거나 같은 파일을 검색하고 싶습니다.

예를 들어 "3_20150414" (3_YYYYMMDD)를 입력하면 출력이 파일 이름이 되기를 원합니다.

3_20150412104422154033.txt
3_2015041211022775012.txt
3_20150412160410171639.txt
3_20150412160815638933.txt
3_20150413161046573097.txt
3_20150413161818852312.txt
3_20150413163054600311.txt
3_20150413163514489159.txt
3_2015041321292659391.txt
3_20150414124528747462.txt
3_20150414125110440425.txt
3_20150414134437706174.txt

다음과 같은 명령을 실행하여 파일을 나열할 수 있습니다.

ls -l | grep '20150413\|20150414' |awk '{print $NF}'

하지만 난 하나를 찾으려고 노력 중이야<=성냥.

답변1

awk문자열 비교 연산자와 함께 및 를 사용할 수 있습니다 .

ls | awk '$0 < "3_20150415"'

변수에서:

max=3_20150414 export max
ls | LC_ALL=C awk '$0 <= ENVIRON["max"] "z"'

여기에서 "z"를 연결하면 비교가 문자열 비교이고 로케일에서 C숫자가 앞에 정렬되므로 하루 중 언제든지 허용됩니다 z.

에서는 zsh다음 작업도 수행할 수 있습니다.

print -rC1 -- *.txt(e['[[ $REPLY < ${max}z ]]'])

답변2

grep아니오 ≤ 연산자그 자체하지만 그것을 속이는 서투른 방법이 있습니다. 0년(또는 1년 중 첫 번째 연도)과 20150414 사이의 모든 날짜가 필요합니다. (BC 날짜가 테이블에 없다고 가정합니다.) 이 범위를 정규 표현식과 일치할 수 있는 하위 범위로 나눕니다.

  • 0년부터 1999년까지 — 모든 연도는 0 또는 1로 시작하므로 grep for [01].
    (모든 정규식은 "3_" 바로 다음 줄의 시작 부분에 고정되어 있다고 가정합니다.)
  • 2000~2009 — 정규식 200.
  • 2010~2014 — 정규식 201[0-4].
  • 2015년 1~3월 - 20150[1-3].
  • 2015년 4월 1일부터 9일까지—2014040
  • 2015년 넷째 달 10~14일—2014041[0-4]

그런 다음 함께 정리하십시오.

grep -E '3_([01]|200|201[0-4]|20150[1-3]|2015040|2015041[0-4])'

ls -l물론, 필요하지 않은 파일에 대한 정보(모드, 소유자, 수정 시간 등)를 많이 알려주기 때문에 awk '{print $NF}'삭제하고 파일명만 유지해도 됩니다. 이는 비효율적이고 오류가 발생하기 쉽습니다(파일 이름에 공백이나 탭이 포함되어 있으면 중단됩니다). 의 출력을 구문 분석하는 것은 결코 좋은 생각이 ls아니지만 조금 더 간단하게 만들어서 더 안전하게 만들 수 있습니다. 원하지 않거나 필요하지 않은 정보를 얻지 말고 버릴 필요가 없습니다.

ls | grep -E '3_([01]|200|201[0-4]|20150[1-3]|2015040|2015041[0-4])'

충분히 좋을 것입니다.

그러나 6개 부분으로 구성된 정규식을 작성하는 것은 지루하고 오류가 발생하기 쉬우며 스크립트 작성이 어렵습니다(불가능하지는 않지만). 더 깔끔한 접근 방식은 다음과 같습니다.

ls | awk 'substr($1, 3, 8) <= 20150414'

그러면 세 번째 위치(즉, "3_" 다음)부터 시작하는 8개의 문자를 추출하여 20150414와 두 개의 8자리 숫자로 비교합니다.

답변3

귀하의 예를 사용하여 가능한 해결책은 다음과 같습니다.

ls -l | grep '3_2015' | awk -v d='3_20150414' '{ s = substr($NF, 1, 10); if (length(s) == 10 && s <= d) print $NF; }'

grep 패턴을 약간 변경하고 awk문자열을 비교하여 원하는 것을 출력하는 매개변수로 검색 값을 전달했습니다.
왜 하면 안되는지에 대한 기사도 많이 있습니다.분석하다ls그래서 저는 약간의 변화를 주어 find를 사용합니다.

find . -type f -name '*3_2015*' -printf "%f\n" | awk -v d='3_20150414' '{ s = substr($NF, 1, 10); if (length(s) == 10 && s <= d) print $NF; }'

관련 정보