파일 및 디렉터리 수정 시간을 반복적으로 변경하는 스크립트

파일 및 디렉터리 수정 시간을 반복적으로 변경하는 스크립트

수천 개의 파일이 포함된 대용량 폴더가 많이 있는데 touch수정 시간을 "원래 시간" + 3시간으로 설정하고 싶습니다.

슈퍼유저의 유사한 스레드에서 이 스크립트를 얻었습니다.

#!/bin/sh
for i in all/*; do
  touch -r "$i" -d '+3 hour' "$i"
done

그래서 나에게 필요한 것은 고정된 디렉토리가 아닌 임의의 디렉토리에서 작동하도록 하는 것입니다(다른 위치에서 실행하고 싶을 때마다 스크립트를 편집할 필요가 없도록). 재귀 파일을 편집합니다.

나는 Linux에 대한 경험이 거의 없으며 프로그래밍(주로 C)에 대해 한두 가지 알고 있지만 bash 스크립트를 설정하는 것은 이번이 처음입니다.

도움주신 모든 분들께 진심으로 감사드립니다 :)

답변1

find -exec재귀의 경우 touch명령줄 인수를 사용하여 디렉터리를 처리합니다.

#!/bin/sh
for i in "$@"; do
    find "$i" -type f -exec touch -r {} -d '+3 hour' {} \;
done

다음과 같이 실행할 수 있습니다.

./script.sh /path/to/dir1 /path/to/dir2

답변2

정확하고 완전한 답변은 다음과 같습니다.

개정하다이용 시간만그리고"만지다"반드시 사용해야 하는 명령"-ㅏ" 매개변수를 사용하지 않으면 명령이 수정 시간도 수정합니다. 예를 들어 3시간을 추가합니다.

touch -a -r test_file -d '+3 hour' test_file

남자의 손길에서:

Update the access and modification times of each FILE to the current time.

-a                     change only the access time

-r, --reference=FILE   use this files times instead of current time.

-d, --date=STRING      parse STRING and use it instead of current time

따라서 파일의 액세스 시간은 이전 액세스 시간에 3시간을 더한 시간과 같습니다. 그리고 수정 시간은 변경되지 않습니다. 다음을 통해 이를 확인할 수 있습니다.

stat test_file

마침내,전체 디렉토리의 접근 시간만 수정및 해당 파일과 하위 디렉터리에 대해 "찾다"디렉토리를 순회하고 사용하는 명령"-구현하다” 매개변수를 사용하여 모든 파일과 디렉터리에 대해 “터치”를 수행합니다(단, “-는 사용하지 마세요).F형"매개변수는 디렉터리에 영향을 주지 않습니다.)

find dir_test -exec touch -a -r '{}' -d '+3 hours' '{}' \;

사람들에게서 발견되었습니다:

-type c     File is of type c:

            d      directory

            f      regular file

-exec의 경우:

-exec command ;
          Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the command until an argument consisting  of  ';'  is  encoun-
          tered.  The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone,
          as in some versions of find.  Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell.   See  the  EXAMPLES
          section  for examples of the use of the -exec option.  The specified command is run once for each matched file.  The command is executed in the starting directory.   There
          are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead.

중괄호를 작은따옴표로 묶어서 쉘 스크립트 구두점으로 해석되는 것을 방지하세요. 세미콜론도 백슬래시를 사용하여 보호되지만 이 경우 작은따옴표도 사용할 수 있습니다.

마지막으로 "yaegashi"와 같은 쉘 스크립트에서 사용하십시오.

#!/bin/sh
for i in "$@"; do
    find "$i" -exec touch -a -r '{}' -d '+3 hours' '{}' \;
done

"yaegashi"가 말한 것처럼 실행하세요.

./script.sh /path/to/dir1 /path/to/dir2

dir1 및 dir2의 모든 디렉토리를 검색하고 각 파일 및 하위 디렉토리의 액세스 시간만 변경합니다.

관련 정보