".." 디렉토리와 같은 숨겨진 항목을 포함하여 디렉토리의 모든 항목을 어떻게 만질 수 있나요?

".." 디렉토리와 같은 숨겨진 항목을 포함하여 디렉토리의 모든 항목을 어떻게 만질 수 있나요?

이 질문은 "라는 질문과 관련이 있습니다.디렉토리의 모든 폴더를 터치합니다.".

touch디렉토리의 모든 것을 처리하는 방법

  • 재귀적으로
  • .."directory up" 과 같은 숨겨진 항목을 포함합니다 ..
  • touch -h심볼릭 링크 를 역참조할 필요가 없으며
  • 참조 파일을 touch -r <file>타임스탬프 소스로 사용

    하나 안에서쉘 스크립트?

답변1

touch귀하의 명령이 -h지원하는 경우역참조하지 않음:

find . -depth -exec touch -h -r "$reference_file" {} +
touch -c -h -r "$reference_file" ..

(이것은 파일이 존재하지 않으면 NetBSD/FreeBSD는 파일 생성을 피하지만 GNU 또는 busybox는 그렇지 않음을 의미합니다 -h( GNU에서는 파일을 생성하지 않고 오류 메시지를 인쇄하지만). 따라서 이식성을 높이기 위해 여기에 추가했습니다. ).-ctouchtouch-c

또는 단일 명령을 사용하여 실행 중인 명령 수를 줄입니다 find.touch

find .. . -depth \( ! -name .. -o -prune \) -exec touch -c -h -r "$reference_file" {} +

즉, ..주어진 파일 목록 에 추가 find하지만find치다(그 안으로 내려가는 대신).

모든 디렉터리(경로가 다음으로 시작하지 않는 디렉터리 -:

find "$dir/.." "$dir/" \( ! -name .. -o -prune \) \
  -exec touch -c -h -r "$reference_file" {} +

( $dir/디렉토리에 대한 심볼릭 링크를 참조하기 위해 여기에서 대신 사용되었습니다 $dir.)$dir

BSD를 사용하면 find다음을 사용할 수 있습니다.

find -f "$dir/.." -f "$dir/" \( ! -name .. -o -prune \) \
  -exec touch -c -h -r "$reference_file" -- {} +

$dir로 시작하는 문제를 방지하려면 -.

다음과 같이 할 수도 있습니다.

(
 cd -P -- "$dir/" &&
   exec find .. . \( ! -name .. -o -prune \) \
     -exec touch -c -h -r "$reference_file" {} +
)

( $reference_file상대 경로가 아니라고 가정).

$reference_file심볼릭 링크 의 경우 GNU를 다음 touch과 함께 사용할 때-h-h-h그거 어디서 났어) 및 FreeBSD에서는 touch대상의 수정 시간을 사용할 수도 있고 사용하지 않을 수도 있습니다 -h.

다음을 사용하는 경우 zsh재귀 와일드카드를 사용할 수 있습니다.

autoload zargs
zargs -- $dir/{.,..,**/*(NDoN)} -- touch -c -h -r $reference_file --

( oN정렬되지 않은 목록은 생략할 수 있습니다. 이는 단지 최적화를 위한 것입니다.)

ksh93은 마침내 2005년에 이 globstar옵션을 사용하여 zsh 재귀 와일드카드에 대한 지원을 추가했습니다.

(set -o globstar; FIGNORE=
 command -x touch -c -h -r "$reference_file" -- ~(N)"$dir"/**)

그러나 여기 ksh에는 여기에 있는 모든 항목 .과 항목이 포함되므로 ..모든 디렉토리가 여러 번 터치됩니다.

bash는 결국 2009년에 ksh93을 복제했지만 globstar원래는 디렉토리를 내려갈 때 심볼릭 링크를 따랐기 때문에 /broken/이었습니다. 2014년 4.3에서 수정되었습니다.

bash에는 명령줄을 분할하여 피하기 위한 zsh zargs또는 ksh93zsh 와 동일한 기능이 없습니다.command -x인수 목록이 너무 깁니다.질문. GNU 시스템에서는 언제든지 GNU를 사용하여 xargs다음을 수행할 수 있습니다.

xargs -r0a <(
  shopt -s dotglob nullglob globstar
  printf '%s\0' "$dir/"{.,..,**}
) touch -c -h -r "$reference_file" --

이제 나는 아마도 find이것을 계속 사용할 것입니다. 성능 저하 외에도 glob의 또 다른 문제점은 디렉토리 트리를 탐색하는 동안 발생하는 오류(예: 액세스 거부)가 자동으로 무시된다는 것입니다.

관련 정보