모든 파일에 재귀 적으로 파일 확장자 추가


106

파일 확장자가없는 파일을 포함하는 몇 개의 디렉토리와 하위 디렉토리가 있습니다. .jpg이 디렉토리에 포함 된 모든 파일 에 추가하고 싶습니다 . 파일 확장자를 변경하는 bash 스크립트를 보았지만 단순히 추가하는 것은 아닙니다. 또한 재귀 적이어야합니다. 누군가 도와 주시겠습니까?

답변:


228

명시 적 루프가없는 대체 명령 ( man find) :

find . -type f -exec mv '{}' '{}'.jpg \;

설명 : 이것은 -type f현재 디렉토리 ( .) 에서 시작하는 모든 파일 ( )을 재귀 적으로 찾고 mv각각에 이동 명령 ( )을 적용 합니다. 또한 따옴표 주위 {}에 공백이있는 파일 이름 (및 개행 문자까지도 ...)이 제대로 처리되도록합니다.


7
특히, 이것은 디렉토리 구조에 많은 수의 파일이있는 경우 더 잘 작동합니다 (반복 할 파일 목록의 길이에 대해 bash가 화가 나게 함).
DrAl

@Al, for파일 목록을 반복하기 위해 bash를 화나게 하는 루프 를 언급하면 올바르지 않습니다. bash for루프는 각 mv명령을 반복적으로 실행합니다.
nik

질문 : 명령문을 실행 하기 전에 먼저find 파일 목록을 설정 합니까 ? 나는 그렇게 생각하지만 무한 루프를 코딩하기 전에이 점을 분명히하고 싶다. -exec
Boldewyn

2
이 명령은 확장자가있는 파일도 찾습니다. 그게 OP가 원하는 건가요?
ghostdog74

1
@ ghostdog74 : 그가이 대답을 받아 들였기 때문에 위의 내용이 분명히 트릭을 수행했습니다. 그렇지 않으면 아래에서 언급했듯이 추가 -not -name "*.*"하면 트릭이됩니다.
Stephan202

62

확장자가없는 파일을 찾아 .jpg를 추가합니다.

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;

이것은 99 %의 시간 동안 원하는 결과를 가장 확실하게 제공합니다. +1
les

9

이것은 조금 늦었지만 지금까지의 것보다 더 나은 솔루션 (가독성이 떨어질지라도)을 추가 할 것이라고 생각했습니다.

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'

find | xargs패턴을 사용하면 일반적으로 각 파일에 대해 새 프로세스를 분기 할 필요가 없으므로보다 효율적인 실행이 가능합니다.

이를 위해서는 기존의 이름 변경이 아닌 데비안 기반 배포판 (일명 prename)에있는 이름 변경 버전이 필요합니다. 그러나 이것은 작은 펄 스크립트 일 뿐이므로 모든 시스템에서 위의 명령을 사용하는 것이 충분히 쉬울 것입니다.


4

이렇게

for f in $(find . -type f); do mv $f ${f}.jpg; done

공백으로 구분 된 파일 이름이있을 것으로 예상하지 않습니다.
그렇다면 이름을 약간 처리해야합니다.

다른 디렉토리에서 명령을 실행
하려면 find .find /target/directory.


1
여기에는 'do'가없고 파일 이름에 공백이 있으면 파일 이름을 인용하는 것이 좋습니다. for f in $ (find. -type f); do mv "$ f" "$ {f} .jpg"; 수행
DrAl

아마도 나는 최상위 디렉토리 내에서 실행할 것입니까?
robjmills

@seengee : 네. 이 명령은 또한에서 대시를 누락합니다 -type.
Stephan202

어딘가에 가서 너무 빨리 입력해야했는데 ... 지금 고쳐야 했어요.

1

Windows 기본에서 확장자가없는 모든 파일의 이름을 변경하려면 다음을 수행 할 수 있습니다 ren * *.jpg . 파일이 확장자가 없으므로 *를 사용하거나 png를 jpg로 변경하려면ren *.png *.jpg


0

rename

확장명이없는 파일의 이름을 바꿀 수 있는지 확실하지 않습니다 (지금 Windows 7을 사용 중입니다)


1
가능하지만 디렉토리의 이름도 변경되며 하위 디렉토리에서 재귀 적으로 작동하도록 지시 할 방법이 없습니다 (적어도 Ubuntu에있는 버전에서는).
mirod

나는 적어도 두 개의 다른 명령을 알고있다. rename하나는 util-linux-ng에 포함 된 C 프로그램이고 다른 하나는 우리 대학의 데비안 머신에있는 Perl 프로그램 (Wall이 직접 작성)이다. 실제로 둘 다 재귀를 수행하지 않습니다.
Boldewyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.