이름의 첫 번째 부분을 동적으로 제거하고 다른 곳에 복사해야 합니다. 내 파일 이름은 다음과 같습니다
Voice_XYZZ_1_1801.pdf
Voice_XYZZ_1_1801.ndx
Electon_MNOPQ_1_1801.pdf
Electon_MNOPQ_1_1801.ndx
런타임 시 음성이나 전자 장치 또는 둘 다 생성될 수 있습니다. 파일 이름에서 첫 부분을 제거해야 합니다. 다음과 같아야 합니다.
XYZZ_1_1801.pdf
XYZZ_1_1801.ndx
MNOPQ_1_1801.pdf
MNOPQ_1_1801.ndx
이를 달성하려면 어떤 명령을 사용할 수 있습니까?
답변1
f
Bourne 시리즈 쉘을 사용한다고 가정하면 다음 명령을 사용하여 파일 이름 변수에서 가장 짧은 선행 하위 문자열 일치(밑줄 포함)를 제거할 수 있습니다.${f#*_}
전임자.
$ touch Voice_XYZZ_1_1801.pdf Voice_XYZZ_1_1801.ndx Electon_MNOPQ_1_1801.pdf Electon_MNOPQ_1_1801.ndx
$ for f in Voice_* Electon_*; do echo "${f#*_}"; done
XYZZ_1_1801.ndx
XYZZ_1_1801.pdf
MNOPQ_1_1801.ndx
MNOPQ_1_1801.pdf
mv
다음과 같이 파일 이름을 바꾸는 명령과 함께 사용할 수 있습니다 .
for f in Voice_* Electon_*; do mv "$f" "${f#*_}"; done
다음 명령을 사용하여 유사하게 다른 위치에 복사할 수 있습니다 cp
.
for f in Voice_* Electon_*; do cp "$f" "newdir/${f#*_}"; done
답변2
이는 명령줄에서 Perl 코드 한 줄을 호출하여 쉽게 수행할 수 있습니다.
ls *_* | perl -ne 'chomp($_); $orig = $_; $_ =~ s/[^_]*_//; rename $orig,$_;'
다음은 코드에 대한 설명입니다.
이름에 "_"가 포함된 모든 파일 이름을 다음 명령으로 보냅니다.
엘에스_|
전달된 각 문자열에 대해 다음 명령을 실행합니다.
펄라이트
파일 이름에서 개행 문자 제거("ls" 명령을 실행한 후 남은 내용)
씹다($_);
단어의 첫 부분을 삭제하고 "_"을 찾을 때까지 검색하세요.
$_ =~ s/[^]*//;
파일명 변경
$orig,$_의 이름을 바꿉니다.