"20150512_101129_3016"이라는 제목의 디렉터리가 여러 개 있고 "20150512_101129_3016_v1A"와 같이 밑줄이 추가된 추가 문자열이 있는 디렉터리도 있습니다(항상 v1A는 아니며 v1 또는 V1a 등일 수 있음). 마지막 밑줄 뒤의 마지막 문자열이 제거되도록 모든 디렉토리의 이름을 바꾸고 싶습니다. 나는 모든 디렉토리 이름이 세 번째 밑줄 문자 앞에 동일한 양의 텍스트를 가질지 확신할 수 없기 때문에 마지막/세 번째 밑줄 뒤의 모든 텍스트(포함)를 제거할 수 있는 솔루션을 선호합니다.
답변1
간단한 쉘 루프를 사용하여 이 작업을 수행할 수 있습니다.
for x in ./*_*_*_*; do mv -i "$x" "${x%_*}"; done
즉, 이름에 밑줄이 3개 이상 포함된 모든 파일에 대해 파일 이름을 바꾸고 마지막 밑줄로 시작하는 부분을 제거합니다.
충돌이 있는 경우(예: 둘 다 20150512_101129_3016_v1A
) 20150512_101129_3016_v1B
사전순으로 첫 번째 파일의 이름이 원하는 대상으로 바뀌고 두 번째 파일은 하위 디렉터리로 이동됩니다 . 즉, 로 20150512_101129_3016_v1B
이름을 바꾼 후 이 경우 추가 확인 사항을 추가하십시오.20150512_101129_3016/20150512_101129_3016_v1B
20150512_101129_3016_v1A
20150512_101129_3016
for x in ./*_*_*_*; do
if [ -e "${x%_*}" ]; then
echo "Not renaming $x because ${x%_*} already exists"
continue
fi
mv "$x" "${x%_*}"
done
또는 Linux에서는 이 검사를 수행하도록 -T
옵션을 전달합니다.mv
답변2
원래 디렉토리 이름이 동종인 경우, 즉 XXXXXX_XXXX_XXXX(다른 _XXXX가 뒤에 올 수 있음) 형식을 따르는 경우 다음 스니펫이 작동합니다.
find ./ -maxdepth 1 -type d | while read dir; do
newdir=$(echo ${dir} | cut -d_ -f1-3)
# duplicate directory name protection
if [ -d ${newdir} ]
then
newdir=${newdir}_
echo "duplicate directory encountered. Appending _ to the new dir name"
fi
#did the dir name change ? If not, do nothing
if [ ${newdir} != ${dir} ]
then
mv ${dir} ${newdir}
fi
done
여기서는 사용자가 이러한 하위 디렉터리를 포함하는 디렉터리에 있다고 가정합니다.