상위 디렉터리(/home/anik/"All My Directories")에 다음과 같은 이름 지정 구조를 가진 100개의 디렉터리가 있습니다.
- Zt.isolate1.Spade
- Zt.isolate2.Spades
- Zt.isolate100.Spades
"Zt"를 제거하고 싶습니다. 그리고 각 디렉토리 이름의 ".Spades" 부분.
루프의 모든 디렉터리에 대해 이 작업을 수행하는 방법을 알려주실 수 있나요? 감사해요.
답변1
이름을 반복하고 변수 대체를 사용하여 원하지 않는 비트를 제거합니다. 다음은 이것이 파일이 있는 위치 $HOME
라고 가정합니다( 파일이 다른 곳에 있는 경우 다른 값으로 변경)./home/anik
topdir
#!/bin/sh
topdir=$HOME
for dirpath in "$topdir"/Zt.*.Spades; do
[ ! -d "$dirpath" ] && continue
newdirpath=$topdir/${dirpath#$topdir/Zt.}
newdirpath=${newdirpath%.Spades}
if [ -e "$newdirpath" ]; then
printf 'Can not rename "%s" into "%s", name taken\n' "$dirpath" "$newdirpath"
else
printf 'Renaming "%s" into "%s"\n' "$dirpath" "$newdirpath"
echo mv "$dirpath" "$newdirpath"
fi
done
이 표현식은 처음에 디렉터리 파일 이름이 없는 $topdir/${dirpath#$topdir/Zt.}
디렉터리의 경로 이름으로 대체됩니다 . Zt.
접두사를 제거한 $topdir/Zt.
다음 $topdir/
처음에 다시 추가하여 이를 수행합니다.
표현식은 값 끝에서 문자열을 ${newdirpath%.Spades}
확장하지만 제거합니다.$newdirpath
.Spades
echo
mv
명령어를 실행하는 대신 실행할 명령어를 출력하기 위해 명령어 앞에 추가했습니다 . 코드를 테스트 echo
하고 올바른 것으로 보이면 삭제하세요.
답변2
Perl 도구를 사용할 수 있습니다 rename
.
rename -n 's/Zt\.(.+?)\.Spades$/$1/' /home/anik/Zt.*.Spades
( -n
출력이 만족스러우면 삭제하여 실제로 이름을 바꾸세요)
확인하다이것올바른 rename
도구를 선택하십시오.