리눅스 초보자가 왔습니다.
첫 번째 bash 스크립트를 작성 중이고 csv 파일 이름을 자르고 삭제하는 코드를 작성했지만 이는 매우 정적이어서 자르고 싶은 문자를 수동으로 계산해야 합니다. 파일의 접두사를 동적으로 제거하고 싶습니다. 사람들이 접두사를 유지하는 예를 많이 보았지만 실제로는 마지막 7자(또는 그 이상... 파일 확장자를 포함)를 유지하고 싶습니다.
예는 다음과 같습니다.
# Sample of filenames in a folder
SOLO_PAL3.xyz.ino.IVC.csv -> renamed to IVC.csv
SOLO_PAL3.xyz.ino.EVC.csv -> renamed to EVC.csv
SOLO_PAL3.xyz.ino.VVC.csv -> renamed to VVC.csv
SOLO_PAL3.xyz.ino.WVC.csv -> renamed to WVC.csv
파일 이름 잘림 - 이 기능이 작동하는 동안 cut -c19-는 현재 특정 파일 길이에 대한 정수를 수동으로 업데이트해야 합니다. 이 예제에서는 실행하기 전에 변경 사항을 볼 수 있도록 에코를 유지했습니다.
for file in ???*;
do echo mv $file `echo $file | cut -c19-`;
# Something equivalent to RIGHT($file,$file.length-($file.length)-7))?
done
미리 감사드립니다!
답변1
귀하의 문제는 다음과 매우 유사합니다.이것, 내 답변은 부분적으로 해당 질문에 대한 답변을 기반으로 합니다.
for f in *.csv
do
newf="${f%.csv}"
newf="${newf##*.}"
printf '%s.csv\n' "${newf}"
done
문제 도메인을 모든 파일의 집합으로 정의했으므로 끝에서 파일을 제거하여 *.csv
루프가 시작됩니다 . .csv
다음으로, 임의의 문자열과 점이 뒤따르는 가장 긴 접두사를 제거합니다 .
. 마지막으로 printf
남은 기본 파일 이름과 다시 첨부된 .csv
.
명령을 실행하는 실제 메커니즘은 mv
독자에게 연습 문제로 남겨 둡니다.
답변2
Perl rename
유틸리티를 사용하십시오:
rename -n 's/^.*\.(.{3}\.csv)$/$1/' *.csv
이렇게 하면 -n
연습 실행이 되므로 실제로 파일 이름을 바꾸지 않고 해당 내용만 표시됩니다.회의하다. 요구 사항을 충족하는지 확인하고 다시 실행하십시오 -n
(또는 자세한 출력을 얻으려면 -n
로 바꾸십시오 -v
).
노트:이는 동일한 이름을 가진 다른 프로그램이 아닌 perl 이름 바꾸기 유틸리티에서만 작동합니다(특히 util-linux 패키지의 이름 바꾸기 유틸리티는 기능과 명령줄 옵션이 완전히 다른 완전히 다른 프로그램입니다).
Perl rename을 실행하여 확인할 수 있습니다 -V
. 출력은 다음과 유사합니다.
$ rename -V
/usr/bin/rename using File::Rename version 1.13, File::Rename::Options version 1.10
Perl 이름 바꾸기용 실행 파일은 때때로 prename
또는 file-rename
. 위의 명령줄이 설치되어 있는 경우 위의 명령줄을 사용하도록 조정하세요.