파일 구조에서 가장 오래된 디렉터리를 확인하기 위해 bash에 스크립트를 작성하려고 합니다.
이 예에는 생성된 날짜와 시간을 모방한 제목을 가진 4개의 디렉터리가 있습니다. 이러한 파일은 , 2022-02-21:20:30:23
및 입니다 . 이 경우 날짜는 임의적이며 단지 스크립트 테스트용으로 개발되었습니다.2022-02-21:22:30:23
2022-02-28:22:30:23
2023-02-28:22:30:23
나는 스크립트가 해당 디렉토리 내에 존재하는 디렉토리를 식별하고 디렉토리 이름을 기반으로 가장 오래된 디렉토리를 식별할 수 있기를 원합니다.
내 초기 시도는 다음과 같습니다. 예, 문자열이 날짜로 올바르게 선언되지 않았다는 것을 알고 있지만 이를 수행하는 방법을 모르고 몇 가지 조언을 사용할 수 있습니다.
oldest="1899-01-01:01:01:01"
dirs=`ls -d */`
for i in $dirs ; do
if [[ oldest < $i ]] ; then
oldest=$i
fi
done
echo $oldest
답변1
(나는 당신이 보여주는 명명 규칙이 당신을 위한 것이라고 가정합니다.목차그리고 가장 오래된 디렉토리를 찾고 싶습니다. 나는 무시했다문서이 디렉토리에. )
명명 규칙에 따라 디렉토리 이름은 확장 쉘 glob에 의해 자동으로 올바르게 정렬되어 */
가장 오래된 디렉토리 이름이 먼저 확장됩니다. 기본적으로 쉘은 사전순으로 일치하는 이름을 제공합니다.
*/
이는 와일드카드 패턴을 확장하고(정확히 일치한다고 가정) 결과를 배열에 저장하고 해당 배열의 첫 번째 및 마지막 요소를 확인하여 가장 오래되고 최신 디렉터리를 얻을 수 있음을 의미합니다 .
dirs=( */ )
printf 'Oldest dir by name is "%s"\n' "${dirs[0]}"
printf 'Newest dir by name is "%s"\n' "${dirs[-1]}"
위의 "가장 오래된 이름/최신 이름"을 참고하세요.실제로"사전순으로 첫 번째/마지막 정렬"을 의미합니다.
/
출력 디렉토리 경로의 꼬리를 제거하려면 표준 매개변수 대체를 사용하십시오.
dirs=( */ )
printf 'Oldest dir by name is "%s"\n' "${dirs[0]%/}"
printf 'Newest dir by name is "%s"\n' "${dirs[-1]%/}"
답변2
파일 이름이 모두 이 YYYY-MM-DD:HH:MM:SS
형식이고 파일 이름이 중요한 경우 사전순으로 정렬할 수 있습니다. 예를 들어 다음은 가장 오래된 이름을 가진 폴더여야 합니다.
printf "%s\n" */ | sort | head -n1
답변3
파일 이름은 항상 이런 형식을 취합니까 YYYY-mm-dd:HH:MM:ss
? 그렇다면 숫자만 다루면 되기 때문에 더 쉽습니다. 이미 언급한 @muru처럼 를 사용하는 것이 sort
가장 직관적인 방법이 될 것입니다. 이와 같이:ls -d --format=single-column */ | sort | head -n 1
수정 날짜를 사용하려면 ls
직접 사용할 수 있습니다.
ls -dt --format=single-column */ | head -n 1 # most recent modification date
ls -dt --format=single-column */ | tail -n 1 # oldest modification date
-d
: 디렉토리 만 표시합니다.
-t
: 날짜순으로 정렬합니다.
single-column
: (파일) 이름만 표시합니다.
*/
클래식 if a < b; then min = b
루프는 bash에서 세트의 최대/최소 수를 찾는 기본 방법입니다. 하지만 번역도 할 수 있어요날짜문자열을 숫자로 변환하여 date
bash 내장 함수를 사용할 수 있습니다 [ .. -t .. ]
. 비록 이것이귀하의 특정 상황에는 적용되지 않습니다.date
- 현재 날짜는 첫 번째 콜론(YYYY-mm-dd HH:MM:SS)으로 인해 파싱할 수 없습니다.:
# mind the space ---v
filename='1989-06-08 12:42:00'
number=$(date -d "$filename" '+%s'))
# 'date' values can directly be compared:
now=$(date '+%s')
if [ number -lt now ]; then
echo $(date -d "number") was in the past.
else
echo $(date -d "number") is in the future.
fi