폴더의 수정 날짜를 마지막으로 변경된 파일로 변경하는 방법은 무엇입니까? [복사]

폴더의 수정 날짜를 마지막으로 변경된 파일로 변경하는 방법은 무엇입니까? [복사]

내 미디어 센터 디렉터리에서 내 폴더의 모든 수정 시간은 필수 날짜가 아닙니다.

기본 폴더의 모든 수정 시간을 각 폴더 내 최신 미디어 파일의 수정 시간으로 어떻게 변경할 수 있나요?

예를 들어:

cd /tmp
mkdir test
cd test
mkdir d1
mkdir d2
touch d1/text1.txt
touch d1/movie1.mov
touch d2/text2.txt
touch d2/movie2.mov
touch notthis.file

이제 나는 다음을 시도했습니다.

ls -td *| head -n 1

그러나 이것은 다음을 제공합니다:

notthis.file

답변1

그리고 zsh:

cd that-dir &&
  touch -r *(D.om[1]) .

하위 디렉터리의 파일도 고려하려면 다음을 수행하세요.

touch -r **/*(D.om[1]) .

비어 있지 않은 모든 디렉토리에 대해 이 작업을 반복적으로 수행하려면 다음을 수행하십시오.

for d (**/*(DFod)) touch -r $d/*(D.om[1]) -- $d

일반 파일이 없는 비어 있지 않은 디렉터리가 있는 경우(포함된 모든 파일이 디렉터리, 심볼릭 링크, fifos...와 같은 비표준 파일인 경우) "일치 항목을 찾을 수 없음" 오류가 발생합니다. 이를 방지하려면 다음과 같이 변경할 수 있습니다.

for d (**/*(DFod)) {
  newest=($d/*(ND.om[1]))
  (( $#newest )) && touch -r $newest -- $d
}

.일반 파일로 제한하지 않으려면 glob 한정자를 제거하십시오. 일반 파일에 대한 심볼릭 링크(및 해당 파일이 가리키는 파일의 수정 시간)도 고려하려면 glob 한정자를 제거 하십시오 -. ^/또는 ^/,F빈 디렉터리(비디렉토리 또는 F빈 디렉터리)를 제외한 모든 유형의 파일입니다.

답변2

다음 괴물을 사용하여 your_dir디렉터리의 타임스탬프를 가장 최근에 수정된 파일의 타임스탬프로 설정할 수 있습니다.

touch -t `ls -ltr --time-style='+%Y%m%d%H%M.%S your_dir' | grep '^-' | tail -1 | awk '{print $6}'` your_dir

"메인 폴더"가 무엇을 의미하는지 명확하지 않으므로 재귀를 포함하지 않았습니다.

답변3

ls(1)수정 시간별로 디렉토리 정렬을 사용하고 , head(1)첫 번째 파일을 가져오고, touch(1)대상 디렉토리의 수정 시간을 변경하는 것은 매우 간단합니다.

구문 분석된 출력은 ls거의 필요하지 않고 특수 문자에 갇히기 쉽기 때문에 일반적으로 권장되지 않습니다. 하지만 이 경우 최신 타임스탬프가 있는 디렉터리의 파일을 쉽게 제공할 수 있는 다른 도구는 생각할 수 없습니다.

touch_dir() {
    dir="$1"
    touch --reference="$(ls -td -- "${dir}"/* | head -n 1)" -- "${dir}"
}

디렉토리 인수를 사용하여 실행하면 디렉토리의 수정 시간이 디렉토리에 있는 모든 파일의 최신 수정 시간으로 설정되어야 합니다.

디렉토리에 파일이 없거나(다양한 방법으로 쉽게 테스트할 수 있음) 최신 파일 이름에 줄 바꿈이 포함되어 있으면 실패합니다. head줄 바꿈 앞 부분만 가져옵니다.

여러 디렉터리를 업데이트하려면 루프에서 실행하면 됩니다.

관련 정보