find를 사용하여 [0-9]{1,10}/*와 일치하는 디렉터리 트리를 찾고, 이동하고, 심볼릭 링크합니다.

find를 사용하여 [0-9]{1,10}/*와 일치하는 디렉터리 트리를 찾고, 이동하고, 심볼릭 링크합니다.

일부 디렉터리를 이동하고 다시 해당 디렉터리에 대한 심볼릭 링크를 만들어야 합니다.

디렉토리 구조는 다음과 같습니다.

/storage1
/storage1/123/named_directory_1
/storage1/123456/named_directory_2
/storage1/123456789/named_directory_3

이사하고 싶어요명명 된다음과 같이 다른 곳의 번호가 매겨진 디렉토리와 일치하는 디렉토리입니다.

/storage2
/storage2/123/named_directory_1
/storage2/123456/named_directory_2
/storage2/123456789/named_directory_3

그런 다음 이러한 명명된 디렉터리는 다시 심볼릭 링크됩니다. 번호가 매겨진 디렉터리는 각 저장소에서 독립적인 디렉터리로 유지되지만, 명명된 디렉터리는 Storage1의 해당 번호가 매겨진 디렉터리에서 Storage2의 일치하는 번호가 매겨진 디렉터리로 심볼릭 링크되어야 합니다.

나는 내가 원하는 것과 일치하는 find 명령을 공식화했습니다. find . -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*"이는 다음과 모두 일치합니다.

/storage2/123/named_directory_1
/storage2/123456/named_directory_2
/storage2/123456789/named_directory_3

하지만 어떻게 해야 할지 모르겠어요. 이와 비슷한 것인데 보시다시피 어떻게 얻는지 모르겠습니다 $number... $numberandnameBASH 매개변수와 대체를 시도해 보았지만 제대로 얻을 수 없습니다.

echo "${named#*/}"
named_directory_1

이:

echo "${named%/*}"
/storage/123

내 최고의 스크립트 개요는 다음과 같습니다.

while read -r named; do
export numberandname="${named#/*/*/*/}"
export number="${numberandname%/*}"
    mv -- "$named" "/storage2/$number/"
    ln -s -- "/storage2/$numberandname "$named"
done < <(find /storage1/ -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*")

답변1

(제 생각에는) 귀하의 코드에 몇 가지 개선 사항을 추가했습니다.

1) 부품 없이 경로를 제공하는 명령 -printf '%P\n'옵션을 사용했습니다. 2) 여기서는 필요하지 않으므로 명령을 제거했습니다.findstorage1
export

#!/bin/bash

src_dir="storage1"
dest_dir="storage2"    

nums_and_names=$(find "$src_dir" -type d -mindepth 2 -maxdepth 2 -regextype grep -regex ".*/[0-9]\{1,10\}/.*" -printf '%P\n')

while read -r named; do
    echo mv -- "${src_dir}/$named" "${dest_dir}/${named%/*}"
    echo ln -s -- "${dest_dir}/$named" "${src_dir}/$named" 
done <<< "$nums_and_names"

관련 정보