대상에 복사하고 이름 충돌로 인해 원래 이름 대신 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
.