s3cmd

2013-07-03 2 views
15

을 사용하여 파일이 S3 버킷에 있는지 확인합니다. 필요한 파일을 모두 성공적으로 업로드하는 프로그램이 있습니다. 업로드해야하는 파일이 매일 있습니다. 파일을 업로드 한 후에 더 이상 파일이 필요하지 않으므로 동기화 할 필요가 없습니다.s3cmd

s3cmd를 사용하여 S3 내에 경로 및 파일 이름이 있는지 확인하는 방법이 있는지 궁금합니다.

답변

21

s3cmd에서 ls 명령을 사용하여 S3에 파일이 있는지 여부를 알 수 있습니다.

배쉬 코드

path=$1 
count=`s3cmd ls $path | wc -l` 

if [[ $count -gt 0 ]]; then 
     echo "exist" 
else 
     echo "do not exist" 
fi 

사용법 : ./s3_exist.sh의 S3 :

편집 //foo/bar.txt : cocoatomo으로

댓글에서 지적 s3cmd ls $path 목록의 모든 파일 그 $path로 시작됩니다. 더 안전한 방법은 s3cmd info $path을 사용하고 종료 코드를 확인하는 것입니다.

새로운 배쉬 코드

path=$1 
s3cmd info $path >/dev/null 2>&1 

if [[ $? -eq 0 ]]; then 
    echo "exist" 
else 
    echo "do not exist" 
fi 
+0

그래서 count는 해당 디렉토리 내의 파일 수입니다. 이해합니다. 그러나 나는 -gt 부분을 뛰어 다니지 않았고 검색을 시도 할 때 아무 것도 찾을 수 없었습니다. 그 부분을 설명해 주시겠습니까? –

+1

주어진 경로 및 파일 이름과 일치하는 파일 수를 센다. S3는 중복 파일 이름을 지원하지 않으므로이 수는 0 (파일 없음) 또는 1 (파일 존재)입니다. "-gt"는 "보다 큼"을 의미합니다. 이것이 더 명확한 경우 [[$ count -eq 1]]을 할 수도 있습니다. Bash의 조건식에 대한 자세한 내용은 다음을 참조하십시오. [link] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

+0

"s3cmd ls"의 첫 번째 인수는 a를 의미합니다. 버킷 이름 또는 파일 이름이 아닌 버킷 이름 다음의 접두사 문자열. "s3cmd ls s3 : // foo/b"는 "s3 : //foo/bar.txt"가 있으면 "$ count -gt 0"은 s3 : // foo/b가 있는지 여부를 표시하지 않습니다. – cocoatomo

2

그 bar.txt라는 및 bar.txt.bak 가정은 버킷 (S3)에 존재 : // foo는 "s3cmd의 LS의 S3를 : //foo/bar.txt"는 표시 다음 출력.

$ s3cmd ls s3://foo/bar.txt 
2013-11-11 11:11 5 s3://foo/bar.txt 
2013-11-11 11:11 5 s3://foo/bar.txt.bak 

명령 결과에서 두 번째 줄을 제거해야하므로 "awk"명령을 사용하여 불필요한 줄을 필터링합니다.

$ filename=s3://foo/bar.txt 
$ s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }" 
2013-11-11 11:11 5 s3://foo/bar.txt 

마지막으로 모든 명령을 빌드합니다. AWS CLI의 최신 버전에서

filename=s3://foo/bar.txt 
count=$(s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }" | wc -l) 

if [ $count -eq 0 ]; then 
    echo "file does not exist" 
else 
    echo "file exists" 
fi 
2

, 당신은 파일이나 디렉토리의 존재를 감지하기 위해 다음과 같은 코드를 사용할 수 있습니다

count=$(aws s3 ls $path | wc -l) 
if [ $count -gt 0 ] 
then 
    (>&2 echo "$path already exists!") 
    return 
fi 
0

우리는 s3cmd의 LS를 사용하여 파일의 경우 하나의 플래그 flag_exists 사실이 걸릴 수 있습니다 파일이 없으면 거기에 있고 false입니다.

FLAG_EXISTS=false 
    for j in $(s3cmd ls s3://abc//abc.txt); do 
     if [[ "$j" == "s3://abc//abc.txt" ]]; then 
     FLAG_EXISTS=true 
     break 
     fi 
    done 
    if [ "$FLAG_EXISTS" = false ]; then 
     echo 'file not exists' 
    else 
     echo 'file exists' 
    fi 

설명 - 유 abc.txt s3cmd 1!을 검색하는 경우, 그것은 그렇게 루핑 및 조건의 경우 경우 사용 확인, abc.txt abcd.txt 등과 같은 값을 반환 할 수 있습니다처럼 LS 많은 값을 반환 할 수 있기 때문에 파일이 존재.

관련 문제