타임스탬프(날짜)를 기준으로 파일을 다른 디렉터리에 복사하는 방법은 무엇입니까?

타임스탬프(날짜)를 기준으로 파일을 다른 디렉터리에 복사하는 방법은 무엇입니까?

dir1에 다음 파일이 있다고 가정해 보겠습니다.

-rw-r--r--  1 user user  10240 Jul  2 11:54 10_data.txt
-rw-r--r--  1 user user  36048 Jul  4 11:56 95_data.txt
-rw-r--r--  1 user user  35634 Jul  7 11:56 01_data.txt
-rw-r--r--  1 user user  10630 Jul  9 11:56 19_data.txt
-rw-r--r--  1 user user  35476 Jul  9 11:57 93_data.txt

타임스탬프, 특히 날짜(2, 4, 7, 9)를 기준으로 이 파일을 복사할 수 있기를 원합니다.

전임자:

copy 10_data.txt into a directory called 02
copy 19_data.txt into a directory called 09
copy 93_data.txt into a directory called 09

대상 디렉터리(01, 02, 03 등)가 이미 존재하므로 디렉터리 등을 만들 필요가 없습니다. 매일 자정 이후에 cron 작업으로 실행할 계획입니다.

find이 작업 (date +%d)이나 이와 유사한 작업에 사용할 수 있는 것이 있나요?

감사합니다!

답변1

zsh를 사용할 수 있는 경우 다음을 사용하여 이 작업을 수행할 수 있습니다.zstat 모듈:

zmodload zsh/stat
for f in *.txt
do
  cp -p -- "$f" $(zstat -F %d +mtime "$f")/
done

zstat -F %d +mtime명령에는 형식화된 출력( -F %d) 이 필요합니다.달의 일파일 수정 시간입니다. 결과로 나오는 10진수 범위는 01부터 31까지이며 명령의 대상으로 사용됩니다 cp.

답변2

statls파일 수정 시간, 파일 크기 또는 가장 많이 표시되는 파일 속성을 찾는 친구입니다 .

예를 들어, FreeBSD에서는 stat -f %Sm -t %d -- foo파일이 마지막으로 수정된 날짜가 표시되는데 foo, 이는 여러분이 찾고 있는 것 같습니다.

아니요 . 다음 예 find와 같이 파일을 직접 반복할 수 있습니다 .bash

for f in *; do
  d=$(stat -f %Sm -t %d -- "$f")
  cp -p -- "$f" $d/
done

대상 OS가 RedHat이라는 귀하의 의견에 대한 응답으로 RedHat의 stat유틸리티에는 FreeBSD의 형식 유연성이 없는 것으로 보입니다. 맨 페이지를 비교할 수 있습니다여기.

date -r foo "+%d"이 명령이 적절한 대체 명령이라는 것을 알 수 있습니다 . 스크립트의 관련 줄은 다음과 같습니다.

  d=$(date -r "$f" "+%d")

답변3

이것을 시도해 볼 수 있습니다. 나는 그것을 테스트했습니다. 작동해야 한다

cp `ls -ltrh *txt  | awk '{if($7=2){print $NF}}'` `ls -ltrh *txt  | awk '{print $7}'`

이틀 동안만 고민했는데 디렉토리가 같은 경로에 있습니다. 다른 날짜를 추가하고 디렉터리가 다른 폴더인 경우 해당 폴더도 추가하세요.

또 다른 가정은 파일 이름에 공백이 없다는 것입니다.

관련 정보