답변:
명시 적 루프가없는 대체 명령 ( man find
) :
find . -type f -exec mv '{}' '{}'.jpg \;
설명 : 이것은 -type f
현재 디렉토리 ( .
) 에서 시작하는 모든 파일 ( )을 재귀 적으로 찾고 mv
각각에 이동 명령 ( )을 적용 합니다. 또한 따옴표 주위 {}
에 공백이있는 파일 이름 (및 개행 문자까지도 ...)이 제대로 처리되도록합니다.
for
파일 목록을 반복하기 위해 bash를 화나게 하는 루프 를 언급하면 올바르지 않습니다. bash for
루프는 각 mv
명령을 반복적으로 실행합니다.
find
파일 목록을 설정 합니까 ? 나는 그렇게 생각하지만 무한 루프를 코딩하기 전에이 점을 분명히하고 싶다. -exec
-not -name "*.*"
하면 트릭이됩니다.
확장자가없는 파일을 찾아 .jpg를 추가합니다.
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
이것은 조금 늦었지만 지금까지의 것보다 더 나은 솔루션 (가독성이 떨어질지라도)을 추가 할 것이라고 생각했습니다.
find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'
find | xargs
패턴을 사용하면 일반적으로 각 파일에 대해 새 프로세스를 분기 할 필요가 없으므로보다 효율적인 실행이 가능합니다.
이를 위해서는 기존의 이름 변경이 아닌 데비안 기반 배포판 (일명 prename)에있는 이름 변경 버전이 필요합니다. 그러나 이것은 작은 펄 스크립트 일 뿐이므로 모든 시스템에서 위의 명령을 사용하는 것이 충분히 쉬울 것입니다.
이렇게
for f in $(find . -type f); do mv $f ${f}.jpg; done
공백으로 구분 된 파일 이름이있을 것으로 예상하지 않습니다.
그렇다면 이름을 약간 처리해야합니다.
다른 디렉토리에서 명령을 실행
하려면 find .
을 find /target/directory
.
-type
.
rename
확장명이없는 파일의 이름을 바꿀 수 있는지 확실하지 않습니다 (지금 Windows 7을 사용 중입니다)
rename
하나는 util-linux-ng에 포함 된 C 프로그램이고 다른 하나는 우리 대학의 데비안 머신에있는 Perl 프로그램 (Wall이 직접 작성)이다. 실제로 둘 다 재귀를 수행하지 않습니다.