[linux] find로 찾은 파일목록에서 경로 정보를 삭제하기

find 커맨드는 현재 경로 하위의 폴더에서 원하는 대상 파일 목록을 출력하는 커맨드입니다.

단, find로 찾은 파일 목록에는 해당 파일의 경로 정보가 앞에 붙어서 함께 표시됩니다. find 커맨드의 정상적인 결과지만, 현재 경로에 있는 파일에도 "./" 경로 표시가 기본으로 함께 표시됩니다.

apost:/var/www/apostdev/content/images/2023# find . -name img_9*.png
./img_9a.png
./12/img_9-1_o.png
./12/img_9-4_o.png
./12/img_9-4.png
./12/img_9-2.png
./12/img_9-2_o.png
./12/img_9-3_o.png
./12/img_9.png
./12/img_9-1.png
./12/img_9_o.png
./12/img_9-3.png

찾은 파일 목록을 사용해 개별 파일별로 셸 커맨드를 적용하면 에러가 발생합니다. 경로 정보가 찾은 파일이름에 붙어있기 때문에 셸 커맨드 실행을 할 때 에러가 발생합니다.

먼저 find로 찾은 파일 목록에서 경로 정보를 삭제하고 출력합니다.

find . -name "img_9*.png" -printf "%f\0"

printf 옵션으로 찾은 파일 목록의 포맷을 설정합니다. "%f\0"은 경로 정보를 제외하고 파일 이름만 출력합니다.

이제 찾은 파일 목록의 파일 이름 각각에 대해서 셸 커맨드를 파이프를 사용해 적용합니다.

 find . -name "upload*.png" -printf "%f\0" | xargs --null -I{} mv {} "o_{}"

xargs는 셸 커맨드라인을 실행하는 명령어입니다.

-I 옵션을 사용해서 파이프로 전달받은 파일 목록을 뒤에 실행할 셸 커맨드로 전달합니다.

커맨드라인 명령어는 파일 이름 앞에 "o_"를 일괄로 붙이는 셸 명령어입니다. 최종실행 커맨드는 upload로 시작하는 모든 png 이미지 앞에 "o_"를 붙이는 작업을 일괄 실행합니다.