12xy[..].log
다음과 같은 문제가 있습니다. 파일 이름을 to 형식으로 바꾸고 싶습니다 [...].log
.
내 문제는 그들 중 일부는 a
처음에 우려 사항이 있고 일부는 그렇지 않다는 것 v
입니다. 따라서 이름의 일부를 특정 문자로 바꾸는 논리를 따르는 명령을 사용할 수 없습니다. (밑줄 등)
빠르게 이름을 바꿀 수 있는 방법이 있나요?
편집: 항상 동일한 접두사를 사용하십시오 MD18
. 예를 들어, 이름이 지정된 파일이 있거나 MD18v230_SHAPE.log
이름이 다른 파일 MD18a004_FACES.log
등이 있습니다. 나는 그들 v230_SHAPE.log
에게 이름을 붙이고 싶습니다 a004_FACES.log
.
답변1
일괄 이름 바꾸기용으로 설계된 도구를 사용하겠습니다. 왜냐하면 이 도구는 작업을 수행하기 전에 온전한지 확인하는 데 능숙하거나 실제로 실행하지 않고도 수행할 작업을 보여줄 수 있는 시험 실행 모드를 제공하기 때문입니다.
그 중 몇 가지가 있는데, 가장 인기 있는 것은 Perl의 입니다. rename
이것은 80년대부터 존재해 왔지만 perl
여전히 더 발전된 것(및 여러 변형)으로 발전한 매우 짧은 예제 스크립트입니다. 이를 perl
통해 문자열 처리 기능의 모든 기능을 사용할 수 있으므로 가능성은 무한합니다.
rename
관련이 없지만 매우 제한된 명령도 패키지에서 호출됩니다 util-linux
.
mmv
이는 역시 1980년대부터 사용된 일괄 이름 바꾸기 전용 도구입니다. 한때 인기가 많았으나 최근에는 유행이 사라진 것 같습니다.
zsh
자동 로딩 기능이 제공되어 zmv
zsh 파일 이름 생성 및 확장 연산자의 모든 기능에 액세스할 수 있습니다.
여기서 작업은 비교적 간단합니다. 로 시작하는 파일의 처음 4개 문자만 제거하면 됩니다 MD18
. 따라서 다음과 같습니다.
rename 's/^MD18//' MD18*.log
mmv 'MD18*.log' '#1.log'
autoload zmv
zmv 'MD18(*.log)' '$1'
다음과 같이 더 간단한 셸에서 언제든지 루프를 사용할 수도 있습니다 bash
.
for file in MD18*.log; do
mv -i "$file" "${file#MD18}"
done
그러나 특별한 도구로는 이를 보장할 수 없습니다. 여기서는 -i
파일 손실/덮어쓰기 과정에서 사용자에게 중단할 수 있는 기회를 제공하기 위해 여전히 Albeit를 사용합니다. 명령을 앞에 추가하여 테스트 실행을 수행할 수도 있습니다 echo
.
답변2
이러한 파일 이름은 모두 12xy로 시작합니까, 아니면 파일 이름의 처음 4자를 제거하시겠습니까? 모든 파일 이름이 12xy_lmn.log, 12xydef.log, 12xyabc.log, 12xyvw.log, ...와 같습니까?
그렇다면 for 루프를 사용하여 이름을 바꿀 수 있습니다.
for fn in ./12xy*.log
do
mv -i "$fn" "$(sed -e 's/^12xy//' <<< "$fn")"
done
충돌을 허용할 수 있으면 "mv -i"를 "mv"로 변경할 수 있습니다.
그러나 파일 이름에서 처음 4자를 제거하려면 내용에 관계없이 다음을 사용하십시오.
for fn in ./*.log
do
mv -i "$fn" "$(sed -e 's/^....//' <<< "$fn")"
done
답변3
for file in /path/to/MD18*.log; do
name=$(echo "$file" | sed -E 's/.{4}(.*)/\1/')
mv "$file" "$name"
done
이렇게 하면 처음 4자가 삭제됩니다.