2017-12-07 20 views
1

Google 클라우드 저장소에 버킷이 있습니다. 버킷에 tmp 폴더가 있습니다. 이 디렉토리에는 매일 수천 개의 파일이 생성됩니다. 매일 밤 1 일보다 오래된 파일을 삭제하고 싶습니다. 나는이 직업에 대해 gsutil에 대한 논쟁을 찾을 수 없었다. 이렇게하기 위해서는 고전적이고 간단한 쉘 스크립트를 사용해야했습니다. 그러나 파일은 매우 느리게 삭제됩니다.마지막 날부터 이전 파일을 삭제하는 gsutil 명령

폴더에 650,000 개의 파일이 있습니다. 540K는 삭제해야합니다. 그러나 내 자신의 쉘 스크립트는 하루 동안 작동하고 단지 34K 파일을 삭제할 수 있습니다.

gsutil주기 기능은 내가 원하는 것을 정확하게 수행 할 수 없습니다. 그는 양동이를 청소하고 있습니다. 난 그냥 특정 폴더의 하단에있는 파일을 정기적으로 삭제하고 싶습니다 .. 동시에 내가 빨리 삭제 싶어요.

귀하의 제안과 도움을 드리지 않습니다. 단일 gsutil 명령으로이 작업을 수행 할 수 있습니까? 또는 다른 방법? 내가 테스트를 위해 만든

간단한 스크립트 (I 일시적으로 대량 파일을 삭제하기 위해 준비했다.)

## step 1 - I pull the files together with the date format and save them to the file list1.txt. 
gsutil -m ls -la gs://mygooglecloudstorage/tmp/ | awk '{print $2,$3}' > /tmp/gsutil-tmp-files/list1.txt 


## step 2 - I filter the information saved in the file list1.txt. Based on the current date, I save the old dated files to file list2.txt. 
cat /tmp/gsutil-tmp-files/list1.txt | awk -F "T" '{print $1,$2,$3}' | awk '{print $1,$3}' | awk -F "#" '{print $1}' |grep -v `date +%F` |sort -bnr > /tmp/gsutil-tmp-files/list2.txt 


## step 3 - After the above process, I add the gsutil delete command to the first line and convert it into a shell script. 
cat /tmp/gsutil-tmp-files/list2.txt | awk '{$1 = "/root/google-cloud-sdk/bin/gsutil -m rm -r "; print}' > /tmp/gsutil-tmp-files/remove-old-files.sh 


## step 4 - I'm set the script permissions and delete old lists. 
chmod 755 /tmp/gsutil-tmp-files/remove-old-files.sh 
rm -rf /tmp/gsutil-tmp-files/list1.txt /tmp/gsutil-tmp-files/list2.txt 


## step 5 - I run the shell script and I destroy it after it is done. 
/bin/sh /tmp/gsutil-tmp-files/remove-old-files.sh 
rm -rf /tmp/gsutil-tmp-files/remove-old-files.sh 
+1

내가 gcsfuse 도구를 사용하여 내 버킷을 장착하여이 문제를 해결했다. 이제 로컬 디스크처럼 버킷을 관리 할 수 ​​있습니다. 그러나 디스크에서 많은 작업을 수행하는 것은 여전히 ​​느립니다. 그래도 지금은 빨리 취소 할 수 있습니다. gcsfuse에 대한 자세한 내용은을 (를) 참조하십시오. https://cloud.google.com/storage/docs/gcs-fuse 하지만 Google은 이러한 요구에 맞는 자동 솔루션이 필요하다고 생각합니다. 비슷한 문제가있는 사용자는이 방법을 사용할 수 있습니다. 나는 이와 관련하여 더 나은 방법을 가진 사람들의 새로운 아이디어에 대해 개방적이다. – spala

답변

2

오늘 현재로는 gsutil 또는 객체 수명주기 관리와 함께이 작업을 수행 할 수있는 간단한 방법이 없습니다.

그렇다면 양동이에있는 개체의 명명 형식을 변경하는 것이 바람직할까요? 즉, "gs : // mybucket/tmp /"아래에 이들을 모두 업로드하는 대신 그 접두사에 현재 날짜를 추가하여 "gs : // mybucket/tmp/2017-12-27 /"과 같은 결과를 얻을 수 있습니다. . 이것의 주요 이점은 다음과 같습니다.

  • 모든 개체에 대해 날짜 비교를 수행 할 필요가 없습니다. gsutil ls "gs://mybucket/tmp/" | grep "gs://[^/]\+/tmp/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/$"을 실행하여 해당 접두사를 찾은 다음 해당 경로의 마지막 부분에서 날짜 비교를 수행 할 수 있습니다.
  • gsutil -m rm -r으로 명령 줄 (각 ​​개별 파일의 이름 대신 접두사)에 더 적은 수의 인수를 제공 할 수 있으므로 쉘이 처리 할 수있는 인수보다 더 많은 인수를 전달할 가능성이 적습니다.
+0

지원해 주셔서 감사합니다. 이 방법은 내가 원하는 것을하지 않습니다. 해결 방법 솔루션을 만들었습니다. 위의 내 설명에서 설명했습니다. – spala

0

예를 들어,이 작업을 수행하는 아주 간단한 방법이있다 :

gsutil -m ls -l gs://bucket-name/ | grep 2017-06-23 | grep .jpg | awk '{print $3}' | gsutil -m rm -I