temukan dan eksekusi hanya pada nama file

1

Saya perlu menemukan semua file yang lebih lama dari X hari dan menghapusnya secara lokal dan dari ember s3 saya. Masalahnya adalah perintah find mengembalikan saya path lengkap dan nama file juga. Saya mencoba mengacaukan nama samaran dan beberapa hal lainnya, tetapi tidak berhasil. Bantuan apa pun akan sangat dihargai.

Untuk saat ini bagian 'hapus secara lokal' adalah ls bukannya rm ketika saya bermain-main dengannya. Untuk rm aku butuh path lengkap.

Saya perlu menelanjangi / home / ec2-user / backup / keluar dari panggilan s3cmd.

$ find /home/ec2-user/backups -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;

/home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz
File s3://kisnardonline//home/ec2-user/backups/FILESYSTEM-2016-04-09_00-00.tar.gz deleted
KisnardOnline
sumber
1
ada apa dengan rm full-path-and-filename?
David Dai
Seperti yang saya sebutkan saya perlu path lengkap untuk rm ... itu adalah bagian s3cmd yang tidak bekerja dengan path lengkap.
KisnardOnline

Jawaban:

1

Ada beberapa cara yang bisa dilakukan. Kombinasi dari find -print0 dan xargs -0 kuat dan aman untuk bekerja dalam kombinasi dengan sed -z (menggunakan NULL sebagai pembatas garis):

find /home/ec2-user/backups -type f -mtime +3 -print0 |\
  sed -z 's/^.*\?backups/s3:\//' |\
  xargs -0 -n 1 s3cmd del

Sejak s3cmd tidak (belum) mendukung penghapusan banyak file, xargs membutuhkan -n 1 untuk membatasi eksekusi ke satu baris sekaligus.

Cara lain, mungkin lebih sederhana, adalah menyambungkan pipa find melalui read dan gunakan subtitusi variabel bash:

find /home/ec2-user/backups -type f -mtime +3 |\
  while read file; do s3cmd del ${file#*ups/}; done
Ziggy Crueltyfree Zeitgeister
sumber
perintah yang saya perlu jalankan bukan rm ... itu s3cmd del s3: // kisnardonline / {}. Bagian rm berfungsi dengan baik.
KisnardOnline
@KisnardOnline sekarang sudah diperbaiki, ditambah satu opsi lain yang ditambahkan
Ziggy Crueltyfree Zeitgeister
1
bagian kedua bekerja .. terima kasih banyak !! find / home / ec2-user / backup -type f -mtime +3 | saat membaca file; do s3cmd del s3: // kisnardonline / $ {file # * ups /}; selesai
KisnardOnline
0

Coba modifikasi sederhana ini:

cd /home/ec2-user/backups/; find -type f -mtime +3 -exec ls {} \; -exec s3cmd del s3://kisnardonline/{} \;

Dengan cara ini setiap jalur dikembalikan find relatif terhadap /home/ec2-user/backups/ dan dimulai dengan ./. Ini akan berhasil jika s3cmd dan / atau server s3 cukup pintar untuk menerjemahkan ./ sebagaimana mestinya (mis. s3://foo/./bar sama dengan s3://foo/bar dll.)

s3cmd tidak bekerja dengan ./

Dalam hal itu:

cd /home/ec2-user/backups/; find -type f -mtime +3 | while read F ; do ls "$F"; F="`echo $F | cut -c 3-`"; s3cmd del "s3://kisnardonline/$F"; done
Kamil Maciorowski
sumber
s3cmd tidak bekerja dengan ./
KisnardOnline
Saya mengedit jawaban saya untuk memuaskan s3cmd yang tidak berfungsi dengan ./.
Kamil Maciorowski