touch
Linux의 명령줄 유틸리티와 다음에서 찾은 예제를 보고 있습니다 .지도 시간, 액세스 또는 수정 타임스탬프를 지정된 시간, 현재 시간 또는 참조 파일로 변경하는 방법을 이해합니다.
그러나 나는 다음을 수행하고 싶습니다. 내 파일의 상대적인 기간(서로 상대적인)에는 잃어버리고 싶지 않은 귀중한 정보가 포함되어 있습니다. 하지만 실제보다 몇 달 더 젊어 보이려면 폴더의 모든 파일이 (재귀적으로) 필요합니다. 따라서 각 파일은 자체 참조하여 시간을 추가할 수 있지만 폴더 트리의 모든 파일에 적용할 수 있습니다. 이를 수행할 수 있는 좋은 방법이 있습니까?
#!/bin/bash
FILES=$(find $HIGHEST_FOLDER -type f -name *.*)
for f in $FILES
do
touch -ram f -F 7776000 f
# bumping access and modification timestamps by 3 months?
done
아니면 find -exec
제안대로 사용하는 것이 좋습니다이것답변? (이 폴더에는 많은 파일이 있습니다.) 그렇다면 어떻게 할까요?
답변1
Linux 시스템을 사용 중이거나 최소한 GNU touch
및 GNU 가 있다고 가정하면 date
다음을 수행할 수 있습니다(bash에서는 zsh
동일하지만 필수는 아님 shopt globstar
).
$ shopt globstar
$ for f in **; do
touch -d "$(date -d "$(stat -c '%y' "$f") +3 months")" "$f"
done
그러나 숨겨진 파일은 무시됩니다. 이들도 일치시키려면 shopt -s dotglob
위 명령보다 먼저 실행하십시오.
설명하다
shopt -s globstar
: 이것은globstar
bash에 대한 옵션을 설정합니다. 즉,**
모든 파일과 0개 이상의 디렉터리 및 하위 디렉터리가 일치됩니다.shopt -s dotglob
:*
(및**
)이 이름이 로 시작하는 파일과도 일치하게 합니다.
.for f in **; do ...; done
: 모든 파일을 반복합니다.및 디렉토리, 다른 이름으로 저장하세요$f
.stat -c '%y' "$f"
: 현재 파일이나 디렉터리의 현재 타임스탬프입니다.date -d $(...) +3 months
: 주어진 문자열로부터 3개월 후의 날짜를 인쇄합니다(이 경우 문자열은stat
에 대한 명령의 출력 입니다$f
).
요약하면 위의 명령은 현재 폴더(모든 하위 디렉터리 포함)에 있는 모든 파일이나 디렉터리의 수정 날짜를 찾아 해당 날짜를 지금부터 3개월로 설정합니다.
답변2
질문에 대한 설명으로 볼 때 마지막 파일 수정 시간을 확인하고 3개월을 추가할 수 있는 도구를 찾고 계신 것으로 보입니다. ++일부 쉘 산술 평가를 사용하여 이를 수행 할 수 있습니다 stat
. touch
예를 들어 file
타임스탬프에 90일을 추가하려면 다음과 같이 작성할 수 있습니다.
touch -d "@$(( $(stat -c '%Y' file) + 90*24*3600 ))" file
file
그런 다음 필요한 모든 것을 반복하십시오 .
답변3
나는 -exec
find -a oneliner를 사용할 것입니다.
find $HIGHEST_FOLDER -type f -name '*.*' -exec touch -d "$(date -d "$(stat -c '%y' {}) +3 months")" {} \;
reference *.*
, 그렇지 않으면 find
현재 디렉터리에서 파일 이름을 가져오고 실패합니다.
마지막으로 이 작업을 강제하려면 \;
백슬래시와 세미콜론을 지정해야 합니다 . 현재 발견 된 파일 -exec
입니다 .{}
find
GNU 터치로 전환 하지 않았 -F
으므로 예제가 작동하지 않습니다. 또한 여러 구문 문제가 있습니다.
위의 for 루프에서 f를 $f로 변경해야 합니다.
touch [...] $f
그렇지 않으면 현재 디렉터리에서 이름이 지정된 파일을 찾아 f
해당 날짜를 x번 변경합니다. 여기서 x는 입니다 $HIGHEST_FOLDER
.
서브셸(루프 앞) 사용을 고집한다면 서브셸에서 설정했는지 $(...)
확인해야 합니다 .$HIGHEST_FOLDER