파일 타임스탬프에 정의된 월과 연도를 추가하여 파일 이름을 바꿉니다.

파일 타임스탬프에 정의된 월과 연도를 추가하여 파일 이름을 바꿉니다.

아래 스크립트를 MYFILES 디렉터리에 저장하여 x 파일을 만들고 해당 타임스탬프가 몇 년과 몇 달에 걸쳐 무작위로 실행되도록 했습니다.

for i in {1938..2037}; do   
    ## create a file with a random month
    touch -d "${i}-$((RANDOM % 12 + 1))-01" file_$((i-1937))
    done  
output:
-rw-r--r-- Users   0 Jul  1  1938 file_1
-rw-r--r-- Users   0 Jun  1  1947 file_10
-rw-r--r-- Users   0 Oct  1  2037 file_100 

MYFILES 디렉터리의 내용을 분석하고 하위 디렉터리 FILES2의 파일을 정렬한 다음 타임스탬프를 기준으로 파일 이름을 바꾸는 스크립트를 만드는 방법에 대해 도움을 주십시오.

예제 출력은 다음과 같아야 합니다.

rw-r--r-- Users   0 Jul  1  1938 file_JUL1938
rw-r--r-- Users   0 Jun  1  1947 file_JUN1947
rw-r--r-- Users   0 Oct  1  2037 file_OCT2037

답변1

정보를 수집하고 반전하려면 GNU 날짜와 통계를 사용하세요.

for f in *
do
  ref=$(stat -c %y "$f" | awk '{print $1}')
  mon=$(date -d "$ref" +%b)
  year=$(date -d "$ref" +%Y)
  echo mv -- "$f" "file_${mon^^}${year}"
done

이것은 bashism을 사용하여 월을 대문자로 표시합니다. 사용할 수 없는 경우 사용합니다 echo "$mon" | tr '[:lower:]' '[:upper:]'. 또 다른 옵션은 가장 가까운 날짜 함수를 사용하여 월의 대문자 버전을 반환하는 것입니다 date +%^b.

샘플 파일을 생성하려면:

touch -d 1938-07-01 file_1
touch -d 1947-06-01 file_10
touch -d 2037-10-01 file_100

샘플 입력에 대한 스크립트 출력:

mv -- file_1 file_JUL1938
mv -- file_10 file_JUN1947
mv -- file_100 file_OCT2037

답변2

ls -l file_* |
awk '{system("echo mv -v -- " $9 " file_" toupper($6) $8);}'

실제 파일 이름을 바꾸려면 echo이 단어를 제거해야 합니다.

설명하다

  1. ls -l file_* | awk- 모든 파일을 나열하고 으로 보냅니다 awk.
  2. system()- 쉘 명령을 실행합니다.
  3. mv -v -- " $9 " file_" toupper($6) $8-
    • mvmv-쉘에서 실행되는 일반적인 명령.
    • toupper(str)- 문자열의 복사본을 반환합니다.스테르, 여기서 모두 소문자스테르해당 대문자로 번역되었습니다.
    • $6- 월 : 8월, 7월, 2월
    • $8- 연도: 1938년, 1947년, 2037년.
    • $9- 파일명 : file_1, file_10, file_100.

문서

$ ls -l file_*
-rw-rw-r-- 1 user user 0 Aug  1  1938 file_1
-rw-rw-r-- 1 user user 0 Jul  1  1947 file_10
-rw-rw-r-- 1 user user 0 Feb  1  2037 file_100

산출

mv -v -- file_1 file_AUG1938
mv -v -- file_10 file_JUL1947
mv -v -- file_100 file_FEB2037

관련 정보