접두사 "ms_PF"를 사용하여 루트 디렉터리 아래 디렉터리의 이름을 바꾼 다음 기본 디렉터리의 수정된 이름을 사용하여 하위 디렉터리의 이름을 바꾸고 추가 "_"를 추가한 다음 모든 디렉터리와 하위 디렉터리를 루트 디렉터리에 복사해야 했습니다. 다음과 같습니다:
root
maindir1
maindir2
subdir1
subdir2
subdir3
maindir1 및 maindir2는 접두사 "ms_PF_"로 이름이 바뀌고 루트에 직접 복사됩니다. maindir2에는 하위 디렉터리가 있으므로 maindir2의 새 이름, 즉 ms_PF_maindir2에 밑줄(_)을 더한 다음 모든 하위 디렉터리가 다음과 같이 루트에 복사됩니다.
ms_PF_maindir1
ms_PF_maindir2_subdir1
ms_PF_maindir2_subdir2
ms_PF_maindir2_subdir3
이 문제에 대해 도움을 주셔서 감사합니다. 내가 시도한 해결책은 이것이었지만 실제로는 수정이 필요합니다.
root_dir="/dwn/icbu_dwn/LL"
prefix="ms_PF_"
do_it () {
awk '{ print "mv $root_dir $prefix ${root_dir/\//_}" }' | sh
}
find "$root_dir" -depth -type d | do_it
답변1
디렉토리가 몇 개밖에 없다면 수동으로 수행하십시오(다른 작업을 수행하는 것보다 작성/디버깅 작업이 더 많이 소요됩니다).
컬렉션이 큰 경우 find(1)
즐겨 사용하는 편집기를 사용하여 영향을 받는 파일 목록을 만들고 이를 이동을 수행하는 스크립트로 변환하세요. 오류를 확인한 후 실행하세요.
sed(1)
더 크거나 중복되는 경우 기본적으로 위와 동일한 작업을 수행하지만 즉시 "새 이름에 대한 경로 편집"을 사용합니다. 아마도 전화를 통해 직접 받을 수도 있습니다 find
. 초보자들에게 겁을 줄 수 있는 훌륭한 농담이 될 것입니다...
답변2
그러면 올바른 순서로 이름이 변경됩니다. 첫 번째 패턴의 후행 슬래시는 일치 항목을 디렉터리로 제한합니다.
cd root
for dir in maindir*/*/ maindir*; do
echo mv $dir ms_PF_${dir/\//_}
done
산출
mv maindir2/subdir1/ ms_PF_maindir2_subdir1/
mv maindir2/subdir2/ ms_PF_maindir2_subdir2/
mv maindir2/subdir3/ ms_PF_maindir2_subdir3/
mv maindir1 ms_PF_maindir1
mv maindir2 ms_PF_maindir2