uuid 이름 바꾸기를 사용하여 소스에서 대상으로 파일 복사

uuid 이름 바꾸기를 사용하여 소스에서 대상으로 파일 복사

대상에 복사하고 이름 충돌로 인해 원래 이름 대신 UUID 이름을 지정하려는 재귀 폴더 구조의 일부 파일이 있습니다.

일반적인 상황에서는 다음과 같이 할 것입니다.

SOURCE_DIR="/some/*/dir/struct/*/img_files" &&\
DEST_DIR="/dest/folder/0" &&\
rm -rf $DEST_DIR &&\
mkdir -p $DEST_DIR &&\
find $SOURCE_DIR \( -name "*.jpg" \) -exec cp {} $DEST_DIR \;

하지만 이름 충돌로 인해 그렇게 할 수 없습니다. 따라서 복사되는 각 파일에 uuid 이름을 할당하고 싶습니다. 이를 위해 다음을 시도했습니다.

SOURCE_DIR="/some/*/dir/struct/*/img_files" &&\
DEST_DIR="/dest/folder/0" &&\
rm -rf $DEST_DIR &&\
mkdir -p $DEST_DIR &&\
find $SOURCE_DIR \( -name "*.jpg" \) -exec cp {} $DEST_DIR/"$(uuidgen).jpg" \;

하지만 폴더에 있는 여러 파일 대신 복사된 파일만 얻습니다.

답변1

하나의 파일만 얻는 이유는 쉘이 명령을 구문 분석할 때 실행 결과로 find확장된 다음 해당 결과를 전달하기 때문입니다.$(uuidgen)uuidgen정적 문자열로도착하다 find. 기타 사소한 질문이 있습니다.

  • 변수 이름에 대문자를 사용하지 마십시오. 이는 전역 환경 변수에 대한 규칙이며 변수 이름 충돌은 디버그하기 어려울 수 있습니다.
  • 귀하의 find문제는 불필요하게 복잡합니다.
  • 항상 변수를 인용하십시오!
  • \이후에는 필요하지 않은 &&것으로 &&충분하지만 변수 선언도 필요하지 않습니다. 다음은 몇 가지 개선 사항이 적용된 작업 버전의 스크립트입니다.
#!/bin/bash

source_dir="/some/*/dir/struct/*/img_files" 
dest_dir="/dest/folder/0" 
source_dir="."
dest_dir="bar"
rm -rf "$dest_dir" &&
  mkdir -p "$dest_dir" &&
  find "$source_dir" -name "*.jpg" -exec sh -c 'name='$dest_dir'/$(uuidgen).jpg; cp "$1" "$name"' sh {} \;

트릭은 sh내부에서 스크립트를 호출하는 것 입니다 find. 나머지는 이것으로 처리됩니다. 이를 전달해야 합니다 sh(또는 첫 번째 및 두 번째 매개변수만 사용하는 다른 임의의 문자열). {}첫 번째 매개변수가 $0이 컨텍스트에 있으므로 를 가져오려면 두 번째 매개변수가 필요합니다 $1.

관련 정보