디렉토리의 모든 폴더를 터치


14

이것을 사용하여 cwd에있는 모든 폴더의 타임 스탬프를 업데이트하려고합니다.

for file in `ls`; do touch $file; done

그러나 작동하지 않는 것 같습니다. 어떤 아이디어가 있습니까?

답변:


21

지금까지의 모든 대답은 (질문의 예뿐만 아니라) touch"모든 폴더를 터치하십시오"라고 말하더라도 디렉토리의 모든 것을 원한다고 가정합니다 . 디렉토리에 파일과 폴더가 포함되어 있고 폴더 만 업데이트하려는 경우 다음을 사용할 수 있습니다 find.

$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +

또는 find구현이 비표준 -mindepth/ -maxdepth술어를 지원하지 않는 경우 :

$ find . ! -name . -prune -type d -exec touch {} +

이:

$ touch -c -- */

다음을 제외한 대부분의 쉘에서 작동합니다.

  • 또한 일반 디렉토리 외에도 touch 디렉토리심볼릭 링크됩니다
  • 그것은 숨겨진 것들을 생략합니다
  • 디렉토리에 어떤 디렉토리 나 심볼릭 링크가 존재하지 않는 경우, 그것은라는 파일을 만들 것 *이외의 껍질을 csh, tcsh, zsh, fish또는 (대신 오류를보고 할) 톰슨 쉘. 여기서는 -c여전히 touch디렉토리가 아닌 파일 일 수 있지만이 문제를 해결하는 데 사용 하고 있습니다 *.

를 사용 하여 숨겨진 디렉토리를 포함 zsh하여 touch디렉토리에만 :

touch -- *(D/)

'{} \ +'는 무엇입니까?
javamonkey79

3
이것은 {} \+특별한 find구문입니다-자세한 내용은 맨 페이지를 읽으십시오. 나는 touch -c ./*/잘 작동 할 것이라고 생각 한다.
jw013

2
하위 폴더로 재귀하지 않도록 -maxdepth 1명령에 포함시켜야 합니다 find. OP는 하위 폴더가 아닌 cwd의 해당 폴더 만 터치하려고합니다.
Steven 월요일

1
@ jw013 그것은-당신은 다른 사람들의 답변에 좋은 아이디어를 계속 첨부 :)
마이클 Mrozek

왜 + 문자를 피하겠습니까? 그것을 해석하는 껍질이 있습니까?
Witiko

11

시험

touch ./*

for모든 단일 파일에 대해 새로운 프로세스를 생성하고 모든 파일 이름, 공백이 있거나 이름이 옵션처럼 보이는 파일에도 작동 하는 불필요한 루프를 피합니다 -t. 작동하지 않는 유일한 시간은 디렉토리에 파일이 아닌 파일이없는 경우라는 파일을 만드는 것 *입니다. 이를 피하기 위해, touch대부분의 구현의 경우 존재하지 않는 파일을 만들지 않는 -c옵션 ( --no-createGNU 버전으로 도 불림 )이 있습니다.

touch -c ./*

도에서 좋은 참조하십시오 jasonwryan의 대답 뿐만 아니라이 일을 .


1
cwd에 백만 개의 폴더가 있으면 어떻게됩니까?
Steven 월요일

"인수 목록이 너무 깁니다"유형 문제가 발생하면 "무거운"도구 find . -type d -maxdepth1 -print0 | xargs -0 touch또는 위 의 MichaelMrozek의 답변 으로 전환하는 것이 가장 좋습니다 .
jw013

7

당신 의 출력을 구문 분석을 시도해서는 안됩니다ls .

또한 "$file"공백을 캡처 하려면 인용해야 합니다. http://www.grymoire.com/Unix/Quote.html을 참조 하십시오

이와 같은 것이 당신이 추구하는 것을 달성 할 수 있습니다.

for file in *; do touch "$file"; done

더 자세한 설명 은 첫 두 배쉬는 함정 을 참조하십시오 .


2
닫았지만 확실하지는 않습니다. touch ./*대부분의 경우 A 가 작동합니다. 여러 파일을 사용할 수 있으므로 for루프 가 실제로 필요하지 않으며 이름이 같은 파일을 올바르게 처리 touch해야합니다 . 이것은 주제에 대한 좋은 자료 입니다. ./--help
jw013

왜 '*'가 작동합니까?
javamonkey79

@ javamonkey79 쉘 globbing 입니다.
jw013

1
@ jw013 훌륭합니다. 휠러 링크에 감사드립니다.
jasonwryan

참고 *파일과 이름이 점으로 시작하는 디렉토리를 캡처하지 않습니다. 이를 해결하는 한 가지 방법 dotglob은를 통해 쉘 옵션 을 활성화하는 것 shopt -s dotglob입니다.
Witiko

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.