파일 이름 타임 스탬프를 어떻게 변경합니까?


8

날짜순으로 dat 파일 이름이 있습니다.

FileName_YYYY_MM_DD_HHMM.dat

각 타임 스탬프에 30 분을 추가하는 명령이 있습니까?


1
타임 스탬프가 생성 날짜와 동일합니까? 와 같은 ls --full-time가요?
Sergiy Kolodyazhnyy

1
아니요, 타임 스탬프는 생성 / 수정 된 날짜와 다릅니다. 타임 스탬프는 데이터가 측정 된 시간을 기준으로합니다.
strawberrie

1
타임 스탬프는 사용자 지정이므로 스크립트에 날짜가 30 분 더해 지도록 계산해야하는 간단한 명령이 필요하지 않습니다. 사람들이 응답하는 데 약간의 시간이 걸릴 수 있습니다.
Sergiy Kolodyazhnyy

1
자정에 가까운 타임 스탬프가 있습니까? 30 분을 추가하면 하루를 하나씩 변경해야 할 수 있습니까?
Sergiy Kolodyazhnyy

1
시간은 어떤 형식입니까? 12 다음에 1,2,3 (12 시간 형식) 또는 12 ~ 13에서 14,15. . . 23, 00 (24 시간 형식)?
Sergiy Kolodyazhnyy

답변:


6

사용 python:

#!/usr/bin/env python2
import glob, re, os, datetime
os.chdir('/path/to/dir')
for f in glob.glob('*.dat'):
    ini_time = datetime.datetime.strptime(re.search(r'(?<=_)(?:\d|_)+(?=.dat$)', f).group(), '%Y_%m_%d_%H%M')
    fin_time = (ini_time + datetime.timedelta(minutes=30)).strftime('%Y_%m_%d_%H%M%S')
    os.rename(f, 'Filename_' + str(fin_time) + '.dat')
  • os.chdir('/path/to/dir')현재 디렉토리를 .dat파일을 포함하는 디렉토리로 변경 합니다. /path/to/dir실제 경로로 교체하십시오 .

  • glob.glob('*.dat') 끝나는 파일을 찾을 수 있습니다 .dat

  • ini_time변수는 처음에 re모듈을 사용하여 원래 파일 이름에서 날짜-시간을 잘라낸 다음 필요한 시간을 추가 할 수 있도록 문자열에서 무엇을 나타내는 항목을 정렬합니다.

  • fin_time결과 시간 (예 : ini_time30 분) 이 포함됩니다.

  • os.rename 그에 따라 파일 이름이 바뀝니다.

또한 연속 된 파일 이름 (30 분마다 다름)을 사용하면 이름이 바뀐 파일이 다음 파일을 덮어 쓰므로 이름이 바뀐 파일 이름에 초를 추가하여 안전하게 유지하는 것이 좋습니다. 그렇지 않으면 이름이 바뀐 파일을 다른 디렉토리에 저장 한 다음 나중에 원래 디렉토리로 바꿔야합니다.


당신과 파이썬, 큰 사랑. =) +1
AB

Filename_이름 바꾸기 방법 에는 문자열 을 사용하지 않아야합니다 .
AB

@AB 왜 그럴까요? (+1도)
heemayl

파이썬 스크립트를 실행 한 후 왜 일부 파일이 누락되었는지 알고 있습니까? 각 파일의 타임 스탬프는 30 분 차이가 있습니다. 아래는 처음 몇 개의 파일 이름에 대한 출력입니다. Filename_2011_01_11_1630.dat Filename_2011_01_11_1830.dat Filename_2011_01_11_1900.dat Filename_2011_01_11_2030.dat Filename_2011_01_11_2100.dat
strawberrie

@strawberrie 모르겠다 .. 문제없이 테스트하고 잘 작동 /path/to/file했다 .. 디렉토리의 전체 경로로 스크립트를 대체 하시겠습니까?
heemayl

2

사용 bash, 이름을 바꾼 파일을 새 하위 폴더에 있습니다 renamed.

파일이있는 폴더에서 스크립트를 시작하십시오.

#!/bin/bash

mkdir -p renamed   

# loop over all dat files in the current folder
for f in *.dat; do

    # the filename without extension    
    filename="${f%%.*}"

    # your timestamp
    old_timestamp=$(echo $filename | grep -P "[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}$")

    if [ "$old_timestamp" == "" ]; then
        >&2 echo "not a valid filename: '$f', skipped."
    else
      # a valid date from the timestamp
      new_date=$(echo "$old_timestamp" | awk -F_ '{HM=NF; D=NF-1; M=NF-2; Y=NF-3; print $Y "-" $M "-" $D " " substr($HM,1,2) ":" substr($HM,3,2) ":00"}')

      # the new time stamp, 30 mins in the future
      changed_timestamp=$(date --date "$new_date 30 minutes" "+%Y_%m_%d_%H%M")

      # copy the file, ${f##*.} is the extension
      cp "$f" renamed/"${filename/$old_timestamp/$changed_timestamp.${f##*.}}"
    fi
done

출력 예 :

% ls -og FileName*
-rw-rw-r-- 1 0 Mai 16 20:35 FileName_2015_05_16_2235.dat

% ./timestamp

% ls -og renamed/FileName*
-rw-rw-r-- 1 0 Mai 16 20:35 FileName_2015_05_16_2305.dat

@strawberrie 이름이 바뀐 파일은 이제 하위 폴더에 위치합니다renamed
AB

이름이 바뀐 파일을 추가 폴더에 저장하는 것이 좋습니다. 문제가 발생하더라도 OP에는 여전히 원본이 있습니다. 좋은 생각, 따라서 +1
Sergiy Kolodyazhnyy

TimeChange.sh : 21 : 덕분에 내가 스크립트를 실행 한 후 다음과 같은 오류가 발생했습니다 @AB TimeChange.sh : 잘못된 대체 내 실제 파일 이름 또는 타임 스탬프 전에 고정 접두사는 FileName_123.Data_YYYY_MM_DD_HHMM.dat처럼
strawberrie을

정의에 FileName_123.Data_YYYY_MM_DD_HHMM.dat따라 부품 .Data_YYYY_MM_DD_HHMM.dat의 확장명입니다. 따라서 FileName_123유효한 타임 스탬프가 아닙니다.
AB

@strawberrie 스크립트를 변경했습니다
AB

1

스크립트

이것은 원본 스크립트의 편집 된 버전입니다. OP는 원래 이름 형식에 대한 완전한 정보를 제공하지 않았습니다. 이 스크립트는 주석에 언급 된 OP가 올바른 파일 이름 지정에 맞게 조정합니다.

* 기술 노트 : *

이 스크립트에서는 파일 이름을 awk를 사용하여 필드 구분 기호로 밑줄을 사용하여 6 개의 개별 필드로 구분합니다. 처음 두 필드 인 $ 1 및 $ 2는 정적 텍스트 문자열로 간주됩니다. 필드 3, 4, 5 및 6은 파일 시스템에서 파일을 만든 날짜가 아니라 OP의 데이터가 샘플링 된 타임 스탬프 입니다.

변수 COPYDIR에는 업데이트 된 타임 스탬프가있는 파일이 저장 될 새 디렉토리의 이름이 있습니다. 우리는 현재 작업 디렉토리에 해당 디렉토리를 만듭니다.mkdir $COPYDIR

변수 TEXTSTRING 및 DATESTRING은 정적 텍스트와 타임 스탬프를 각각 유지합니다. 샘플 출력에서는 두 개의 다른 문자열을 사용하여 처음 두 필드가 보유한 텍스트에 관계없이 스크립트가 작동 함을 증명했습니다.

NEWEPOCHTIME은 계산 된 새 타임 스탬프를 유닉스 시대 형식으로 유지하는 변수입니다. NEWDATE는 유닉스 시대에서 YYYY-MM-DD HH : MM 형식으로 변환 된 타임 스탬프를 보유하는 변수입니다. NEWAPPEND는 OP에 원하는 YYYY_MM_DD_HHMM 형식으로 파일에 추가 될 실제 타임 스탬프입니다.

cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat 업데이트 된 데이터 스탬프를 사용하여 이전 파일을 "converted_files"디렉토리로 이동합니다 (이동하는 대신 데이터 손실을 방지하기 위해).

공지 사항 , 스크립트가 한 명명 형식이 될 때 작동합니다 정말 다음에, 즉, 모든 파일은 정말SomeText_123.Data_YYYY_MM_DD_HHMM.dat형식을.

#!/usr/bin/env bash
#
# Author: Serg Kolo
# Description: this script takes timestamp within the filename
# (which may be different from file's actual creation date)
# converts that date and time to unix's epoch time
# adds 30 minutes to it and renames it

COPYDIR="converted_files"
mkdir $COPYDIR

for file in *.dat; do
        TEXTSTRING=$(stat -c %n $file | awk -F'_' '{print $1"_"$2"_"}' )
        DATESTRING=$( stat -c %n $file | awk -F'_' '{gsub(".dat","");  print $3"-"$4"-"$5" "$6}' )
        NEWEPOCHTIME=$( expr $( date --date="$DATESTRING" +%s ) + 1800 )
        NEWDATE=$(date --date=@"$NEWEPOCHTIME" +%F"_"%R)
        NEWAPPEND=$(echo $NEWDATE | awk '{gsub("-","_");gsub(":","");print}')
        cp $file "$COPYDIR"/"$TEXTSTRING""$NEWAPPEND".dat
done

행동하는 스크립트

데모 벨로우즈는 터미널에서 직접 복사 한 것입니다. 처음 두 필드에 두 개의 다른 문자열로 원본 파일을 만들었습니다. 따라서 밑줄로 구분 된 두 개의 문자열 만있는 한이 스크립트는 파일 이름의 시작 부분에 상관없이 작동해야합니다.

notes-conversion이 질문에 대해 작업하는 동안 메모에서 스크립트를 개발했기 때문에 스크립트의 이름이 지정되었습니다 .

HHMM 파트가 2345 (자정 15 분 전) 인 파일 이름은 0015로 업데이트되고 DD 파트는 다음 날로 업데이트됩니다. 24 시간 형식 유지

또한 for 루프는 .dat파일 만 찾기 때문에 작업 디렉토리에있을 수있는 다른 파일이나 디렉토리의 이름을 바꾸지 않으므로 잠재적 인 데이터 손실을 피할 수 있습니다. 아래 예제에서, 원래 디렉토리에는 11 개의 항목이 있으며 그 중 3 개는 *.txt테스트 용 파일이므로 8 개의 .dat파일 로만 작업 합니다. 업데이트 된 파일이있는 디렉토리에는 8 개의 파일이 있으며 .dat다른 파일은 없습니다. 데이터는 안전하고 스크립트는 작업을 수행합니다.

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
85 $ ls
FileName_123.Dat_2015_05_31_1245.dat  Test.txt
FileName_123.Dat_2015_05_31_2345.dat  YoloSwag_123.Dat_2015_05_31_1245.dat
FileName_Foo.Bar_2015_05_31_1245.dat  YoloSwag_123.Dat_2015_05_31_2345.dat
FileName_Foo.Bar_2015_05_31_2345.dat  YoloSwag_Foo.Bar_2015_05_31_1245.dat
File.txt                              YoloSwag_Foo.Bar_2015_05_31_2345.dat
Random.txt

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
86 $ ls | wc -l
11

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
87 $ notes-conversion                                                                                

[68 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
88 $ ls converted_files/; ls converted_files/ | wc -l                                                
FileName_123.Dat_2015_05_31_1315.dat  YoloSwag_123.Dat_2015_05_31_1315.dat
FileName_123.Dat_2015_06_01_0015.dat  YoloSwag_123.Dat_2015_06_01_0015.dat
FileName_Foo.Bar_2015_05_31_1315.dat  YoloSwag_Foo.Bar_2015_05_31_1315.dat
FileName_Foo.Bar_2015_06_01_0015.dat  YoloSwag_Foo.Bar_2015_06_01_0015.dat
8

[67 ]SERGIY@UBUNTU_[/home/xieerqi/testdir/conversion/convert2]
***********************************************
89 $ 

설명 (원본 게시물에서)

*) 오늘 나는 유닉스 리눅스 시스템이 시간을 Epoch time으로 계산 하거나 단순히 초를 넣는다 는 것을 배웠다 .

*) 스크립트는 각 파일 이름을 가져 와서 날짜를 추출하여 epoch로 변환하고 1800 초 (정확한 30 분)를 추가 한 후 새 타임 스탬프보다 파일을 저장합니다.

*)이 스크립트는 OP가 원하는 것을 해결합니다-파일 자체의 생성 시간을 업데이트하지 않고 파일 이름의 타임 스탬프를 변경합니다

사용되는 도구 :

  • 우분투 15.04

  • GNU bash 4.3.30

  • GNU awk 4.1.1

  • 날짜 (GNU coreutils) 8.23


그건 그렇고, ls | 화장실 -l 전에 36 개 파일을 제공하고, 스크립트 후도 (36) 파일, 아무도없는 없습니다
세르지 Kolodyazhnyy에게

또한 stat -c % n 파일을 사용하는 이유는 ls의 구문 분석 출력이 일반적으로 좋은 생각이 아니기 때문입니다. 어떤 사람들은 find명령을 사용하는데 , 이는 또한 좋습니다.
Sergiy Kolodyazhnyy

감사합니다 @ Serg. 스크립트를 실행 한 후 폴더에 727 개 파일 중 2 개만 남은 이유를 모르겠습니다.
strawberrie

실제 파일 이름과 게시 한 예제간에 차이가 있습니까?
Sergiy Kolodyazhnyy

또한 "스크립트 실행"의 첫 번째 줄을 실행 했습니까? rm *는 내 자신의 디렉토리를 정리 한 다음 파일 이름에 다른 날짜로 테스트 파일을 만듭니다. 당신은 그것을 실행하지 않았다
Sergiy Kolodyazhnyy

-1

이 코드를 사용하여 필요한 것을 수행 할 수 있습니다

  1. 백업하고 코드를 먼저 테스트하여 자신의 사례에 적합한 지 확인해야합니다.
  2. 당신은 24H 형식을 사용하고 있습니다
  3. 23:29 이후에는 파일 이름이 지정되지 않습니다 (이 시간 이후에 파일이있는 경우 날짜도 변경하도록 코드를 수정해야 함)

코드는 다음과 같습니다

cd /path/to/the/files

for i in `ls`; do MM=${i:(-6): -4}; HH=${i: -8 : -6 }; NAME=${i: 0 : -8 } ; if [ "$MM" -lt 30 ] ; then  NEWMM=$((10#$MM+30)); mv -f $i $NAME$HH$NEWMM.dat ; else NEWHH=$((10#$HH+1));NEWMM=$((10#$MM-30)) ; mv -f $i $NAME$NEWHH$NEWMM.dat ; fi ; done ;

작동 방식 : 코드는 파일 이름에서 분 부분을 확인한 MM다음 30보다 작 으면 30 이상인 경우 30을 더하고 이름 부분에 MM1 시간을 더한 다음 HH30 분을 공제합니다. MM이름의 일부


다운 유권자에 대한 이유를 알려주십시오?
팻 마인드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.