일부 디렉터리를 이동하고 다시 해당 디렉터리에 대한 심볼릭 링크를 만들어야 합니다.
디렉토리 구조는 다음과 같습니다.
/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
... $numberandname
BASH 매개변수와 대체를 시도해 보았지만 제대로 얻을 수 없습니다.
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) 여기서는 필요하지 않으므로 명령을 제거했습니다.find
storage1
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"