dizin ağacındaki en eski dosyadan en yeniye ve etkileşimli olarak her dosyayı sil


0

1. adımda, izleyerek çözdüğüm dizin ağacındaki en eski dosyayı bulmaya çalışıyorum. bu soru .

Şimdi kullanmak istiyorum xargs etkileşimli olarak en eskiden en yeniye silme.

Bundan beri find -type f -printf '%T+ %p\n' | sort | xargs -0 -d '\n' rm -i çalışmıyor. Başka bir yazı gördüm find . -type f -print0 | xargs -0 ls -rt ama ekleyerek xargs Ne yazık ki işe yaramıyor.

pi@raspberrypi:/usr/share/doc/samba$ find . -type f -print0 | xargs -0 ls -rt | xargs -0  -d '\n' rm -i
    rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.oc.IBM-DS’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-netscapeds5.x.README’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema.IBMSecureWay’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-schema-FDS.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.schema.at.IBM-DS.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba-nds.schema.gz’? rm: remove write-protected regular file ‘./examples/LDAP/samba.ldif.gz’? rm: remove write-protected regular file ‘./examples/LDAP/ol-schema-migrate.pl.gz’? rm: remove write-protected regular file ‘./examples/LDAP/get_next_oid’? rm: remove write-protected regular file ‘./README.Debian’? rm: remove write-protected regular file ‘./TODO.Debian’? rm: remove write-protected regular file ‘./NEWS.Debian.gz’? rm: remove write-protected regular file ‘./copyright’? rm: remove write-protected regular file ‘./changelog.Debian.gz’? rm: remove write-protected regular file ‘./examples/LDAP/README’?

Lütfen bunun bir izin sorunu olmadığını unutmayın. Kullandım /usr/share/doc/samba gerçek dosya adlarımı yayınlamaktan kaçınmak için bir örnek.

Web'de arama yaparken, özyinelemeli (ağacın tamamı), boş dosya karakterlerini işleyen ve etkileşimli herhangi bir komut dosyası bulamadım. Bu yüzden bunu yaptım. Bu, her tür özel karakteri işlemez. Yani herhangi bir gelişme kabul edilirdi.

#!/bin/bash
find -type f -printf '%T+ %p\n' | sort | head -n 3 > /tmp/1
cut -c32- /tmp/1 | awk '{print "rm -i", "\""$_"\""}'/tmp/2
bash /tmp/2

Yanıtlar:


0

Komut dosyasında gördüğüm tek sorun karakterleri " ve yeni hat. Bir dosya adındaki yeni satır için çok fazla endişelenmemelisiniz.

Örneğin, farklı bir geçici dosya adı kullanmak isteyebilirsiniz. $$ dosya adına.

Öyleyse, gelişme olarak:

#!/bin/bash
TMP1=/tmp/file1.$$
TMP2=/tmp/file2.$$
find -type f -printf '%T+ %p\n' | sort | head -n 3 > $TMP1
cat $TMP1 | sed 's/"/\\"/g;s/[^ ]* //;s/^/rm -i "/;s/$/\"/' >$TMP2
bash $TMP2
rm -f $TMP1 $TMP2

Bu, dosya adınızdaki alıntıları işlemelidir. (not: senaryoda hala bazı sorunlar var. Bunu kendi ev ortamınızda da yapmanız iyi bir şey. Başkentlerde TMP tavsiye edilmiyor, ama yine de yapıyorum.)

Not: xargs -p İçinde boşluk olan dosya isimleriniz olduğunda çalışmaz.


0

Neredeyse oradaydın.

Bu istediğinizi yapar ve dosya adlarındaki boşlukları işler:

find -type f -printf '%T+ %p\n' | sort | cut -c32- | xargs -p -n1 -d '\n' rm

-p, --interactive: Kullanıcıdan her komut satırını çalıştırıp çalıştırmamasını isteyin terminalden bir çizgi. Komut satırını sadece cevap y veya Y ile başlıyorsa çalıştırın.

-n max-args, --max-args=max-args: Komut satırı başına en fazla max-arg argümanını kullanın.

-d delim Girdi öğeleri belirtilen karakterle sonlandırılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.