루프를 사용하지 않고 Linux에서 여러 파일의 확장명 제거 [닫기]

루프를 사용하지 않고 Linux에서 여러 파일의 확장명 제거 [닫기]

예시 파일:

RBFATL001USCGA002.--K1234--
RCAVTL001USCGA043.--K2135--

산출:

RBFATL001USCGA002
RCAVTL001USCGA043

답변1

항상 사이클이 있습니다. 어쩌면 루프를 숨기는 도구를 원한다는 뜻일까요?

perl그런 다음 's rename( prename또는 라고도 함)를 사용할 수 있습니다 perl-rename.

rename 's/\.[^.]+\.*\z//s' ./*.*

또는 zsh다음과 같을 수도 있습니다 zmv:

autoload zmv
zmv '(*).[^.]##.#' '$1'

기본적으로 이러한 파일은 숨겨진 파일(이름이 로 시작하는 파일)의 이름을 바꾸지 않습니다 .. 이들도 처리하려면 다음을 수행하십시오.

zmv '(?*).[^.]##.#(#qD)' '$1'

.foo.bar.에 확장이 있다고 생각하는 사람들 (그리고 확장이 없다고 .bar.생각하는 사람들). ( ) foo...로 변경을 고려하고 싶다면 이를 조정하면 됩니다 . 나는 당신이 그것을 고려하고 싶지 않다고 생각합니다 (이것은 제거될 것입니다 (그러나 파일 이름이 비어 있을 수 없기 때문에 실패할 것입니다))..zmv '(?*).*(#qD)' '$1'.foo.bar.zmv '*(#qD)' '${f%%.*}'

또한 에서는 file.tar.gz확장이 고려 .gz되지 않고 로 간주됩니다 .tar.gz.

이 작업을 재귀적으로 수행합니다.

zmv '(**/)(?*).[^.]##.#(#qD)' '$1$2'

또는 다음을 사용하여 rename:

find . -depth -name '?*.*' -exec rename 's/\.[^./]+\.*\z//s' {} +

답변2

루프를 사용하지 않고 이를 수행하는 방법은 다음과 같습니다.

find . -type f -name "?*.*" -exec sh -c 'mv -v "$0" "${0%.*}"' '{}' \;

관련 정보