여러 디렉터리 이름의 마지막 부분을 제거하는 방법은 무엇입니까?

여러 디렉터리 이름의 마지막 부분을 제거하는 방법은 무엇입니까?

"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_v1B20150512_101129_3016_v1A20150512_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

여기서는 사용자가 이러한 하위 디렉터리를 포함하는 디렉터리에 있다고 가정합니다.

관련 정보