다음 명령을 사용하여 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 쉘에서 호출되는 파일을 생성합니다(이 경우 오류가 보고됩니다). 여기서는 이 문제를 해결하기 위해 이를 사용하고 있지만 여전히 이라는 문제가 있을 수 있습니다.csh
tcsh
zsh
fish
-c
touch
*
숨겨진 디렉터리를 포함한 디렉터리에만 를 zsh
사용 하세요 .touch
touch -- *(D/)
답변2
노력하다
touch ./*
각 파일에 대해 새 프로세스를 생성하는 불필요한 루프를 방지하고 for
모든 파일 이름에 대해 작동합니다. 심지어 공백이 있거나 옵션처럼 보이는 이름에도 작동합니다(예: -t
). 이것이 작동하지 않는 유일한 경우는 디렉토리에 (점이 아닌) 파일이 없는 경우입니다. 이 경우 *
이를 방지하기 위해 touch
대부분의 구현별 경우에 다음이 있습니다 . -c
옵션( --no-create
GNU 버전에서도 호출됨)은 존재하지 않는 파일을 생성하지 않습니다.
touch -c ./*
또한 좋은 참고 자료를 참조하십시오제이슨 소변의 답변이하나.
답변3
또한 "$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로 두었습니다.