서로 다른 두 폴더의 폴더/기호 링크 이름을 비교하는 스크립트를 어떻게 작성합니까?

서로 다른 두 폴더의 폴더/기호 링크 이름을 비교하는 스크립트를 어떻게 작성합니까?

심볼릭 링크를 생성하기 위한 스크립트를 작성하는 데 도움이 필요합니다. 다음은 제가 백그라운드에서 실행한 스크립트입니다.

#!/bin/bash
SOURCE="/home/$USER/www"
DEST="/var/www"
while true; do
    find $SOURCE -maxdepth 1 -type d -not -name "old.**" -exec ln -s -- {} "$DEST"/{} \;
    find $DEST -maxdepth 1 -type l -exec test ! -e {} \; -delete
sleep 30
done

이제 이 스크립트를 통해 몇 가지 작업을 더 수행하고 싶습니다.

  • 이미 연결된 폴더와 '이전'이 포함된 폴더는 무시합니다. 접두사 .
  • $SOURCE에서 기본 폴더를 사용할 수 없는 경우 $DEST에서 기호 링크를 제거합니다.

이 스크립트에 해당 기능을 추가할 수 있도록 도와주세요. 감사해요.

답변1

이것이 예상한 것보다 더 번거로울 수 있다는 것을 알고 있지만 -exec ...하나의 입력 매개변수(심볼릭 링크할 디렉터리 이름)를 가져오는 별도의 스크립트로 해당 부분을 다시 작성한 다음 심볼릭 링크가 이미 존재하는지(예: if [ -h "$DEST/$1" ] ...) 확인하고 필요한 경우 , 올바른 위치로 확인되는지 여부(예 if [ $(readlink $DEST/$1) == $SOURCE/$1 ] ...: 두 조건이 모두 true이면 파일을 건너뛰고, 그렇지 않으면 심볼릭 링크가 (다시) 생성됩니다.

그런 다음 exec 클래스에서 다음과 같이 이 스크립트를 호출합니다. find $SOURCE -maxdepth 1 -type f -not -name "old.**" -exec make-symlink.sh {} \;

몇 가지 추가 사항:

  • find대신 대체할 파일 이름{} 포함할 것이다$SOURCE: 예를 들어 귀하의 경우 최종 exec명령은 다음과 같습니다 ln -s -- /home/user/www/public /var/www/home/user/www/public. 를 사용하여 이 문제를 해결하십시오 basename.

  • 일부 시스템(OS X)에서는 $SRC 디렉토리 자체가 디렉토리 찾기 목록에 포함됩니다 find. 이것은 아마도 당신이 원하는 것이 아닐 것입니다. 출력 의 첫 번째 줄을 제거하거나 절을 find추가하여 이 문제를 해결하십시오 -not -name $(basename $SOURCE).

도움이 되었기를 바랍니다.

관련 정보