와일드카드를 사용하여 심볼릭 링크 만들기

와일드카드를 사용하여 심볼릭 링크 만들기

동일한 디렉터리 계층 구조를 가진 여러 개의 하드 드라이브가 있습니다. 예를 들면 다음과 같습니다.

/media/sda/dir1
/media/sda/dir2
...
/media/sdb/dir1
/media/sdb/dir2

이름과 디렉터리 이름이 비슷한 두 개의 하드 드라이브. 각 하드 드라이브에 dir1과 dir2에 대한 별도의 심볼릭 링크를 만들고 싶습니다. 내가 찾은 가장 쉬운 방법은 다음을 사용하는 것입니다 cp -sR.

cp -sR /media/sd*/dir1 /somedir/dir1
cp -sR /media/sd*/dir2 /somedir/dir2

그러나 이렇게 하면 /somedir에 새 디렉터리가 생성되며, 이로 인해 디렉터리 타임스탬프가 쓸모 없게 되는 등 다양한 부작용이 발생합니다.

/media/sd*/dir1 및 /media/sd*/dir2에 대한 dir1 및 dir2라는 심볼릭 링크를 어떻게 생성합니까? 파일은 정기적으로 하드 드라이브에 추가되므로 정기적으로 이러한 명령을 실행해야 합니다.

답변1

/somedir/dir1/*그러면 에 대한 심볼릭 링크가 생성됩니다 /media/sd*/dir1/*.

mkdir /somedir/dir1
ln -sf /media/sd*/dir1 /somedir/dir1

파일이나 디렉터리가 여러 파일이나 디렉터리에 존재하는 경우 /media/sd*/dir1/링크는 마지막 파일이나 디렉터리를 가리킵니다. 예를 들어 다음과 같습니다.

/media/sda1/dir1/Movies
/media/sda1/dir1/Pictures
/media/sdb1/dir1/Movies
/media/sdb1/dir1/Data

당신은 얻을 것이다:

/somedir/dir1/Movies -> /media/sdb1/dir1/Movies
/somedir/dir1/Pictures -> /media/sda1/dir1/Pictures
/somedir/dir1/Data -> /media/sdb1/dir1/Data

그러나 이것이 당신이 원하는 것인지 확실하지 않습니다.

제 생각엔 unionfs설치가 /media/sd*심볼릭 링크보다 목적에 더 잘 맞는 것 같습니다.

답변2

다음을 수행할 수 있습니다.

for dir in dir1 dir2
do
  [[ ! -d /somedir/$dir ]] && mkdir /somedir/$dir    
  find /media/sd*/$dir -type f -exec bash -c \
    '[[ ! -f /somedir/'$dir'/$(basename $1) ]] && ln -s $1 /somedir/'$dir'/' foo {} \;
done

그러면 /media/sd*/dir1(또는 dir2) 아래에 존재하는 모든 파일을 가리키는 /somedir/dir1/(또는 dir2)에 심볼릭 링크가 생성됩니다. 이 스크립트는 소스 디렉터리 아래에 존재할 수 있는 계층 구조를 유지하지 않습니다.

편집: 모든 링크를 하나의 디렉토리에 두려는 경우 약간 수정된 버전은 다음과 같습니다.

[[ ! -d /somedir/data ]] && mkdir /somedir/data    
find /media/sd*/dir[12] -type f -exec bash -c \
    '[[ ! -f /somedir/data/$(basename $1) ]] && ln -s $1 /somedir/data/' foo {} \;
done

관련 정보