디렉토리의 모든 폴더를 터치합니다.

디렉토리의 모든 폴더를 터치합니다.

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

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

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

답변1

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

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

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

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

이것:

$ touch -c -- */

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

  • 그것은 또한 것입니다touch 디렉토리에 대한 심볼릭 링크일반 디렉토리 외에
  • 숨겨진 것을 무시합니다
  • 디렉토리가 없거나 디렉토리에 대한 심볼릭 링크가 없으면 *Thompson 쉘이 아닌 쉘이나 Thompson 쉘에서 호출되는 파일을 생성합니다(이 경우 오류가 보고됩니다). 여기서는 이 문제를 해결하기 위해 이를 사용하고 있지만 여전히 이라는 문제가 있을 수 있습니다.cshtcshzshfish-ctouch*

숨겨진 디렉터리를 포함한 디렉터리에만 를 zsh사용 하세요 .touch

touch -- *(D/)

답변2

노력하다

touch ./*

각 파일에 대해 새 프로세스를 생성하는 불필요한 루프를 방지하고 for모든 파일 이름에 대해 작동합니다. 심지어 공백이 있거나 옵션처럼 보이는 이름에도 작동합니다(예: -t). 이것이 작동하지 않는 유일한 경우는 디렉토리에 (점이 아닌) 파일이 없는 경우입니다. 이 경우 *이를 방지하기 위해 touch대부분의 구현별 경우에 다음이 있습니다 . -c옵션( --no-createGNU 버전에서도 호출됨)은 존재하지 않는 파일을 생성하지 않습니다.

touch -c ./*

또한 좋은 참고 자료를 참조하십시오제이슨 소변의 답변하나.

답변3

구문 분석을 시도해서는 안 되는 출력ls.

또한 "$file"공백을 잡으려면 인용문을 사용해야 합니다. 바라보다http://www.grymoire.com/Unix/Quote.html

이와 같은 것이 당신이 원하는 것을 달성할 수 있습니다:

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

처음 두 개를 보세요.헤비히트 트랩더 자세한 설명을 위해.

답변4

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

최소 및 최대 깊이 수준은 무엇입니까?

최대 깊이 수준:시작점 아래의 가장 높은 수준(음수가 아닌 정수)으로 내려가는 디렉터리 수준입니다. -maxlength 0은 시작점 자체에만 테스트와 작업을 적용한다는 의미입니다.

최소 깊이 수준:레벨(음수가 아닌 정수)보다 낮은 레벨에서는 테스트나 연산을 적용하지 마십시오. -minlength 1은 시작점을 제외한 모든 파일을 처리한다는 의미입니다.

일반적으로 8보다 깊은 디렉토리는 없습니다. 그래서 위 명령에서는 최대 깊이를 8로 두었습니다.

관련 정보