[Çözüldü] Arşiv İçinde ki Dizin İsimleri Nasıl Öğrenilebilir?

Başlatan mhmtkrktr, 15 Kasım 2016 - 18:09:13

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

mhmtkrktr

Başlıkta sorduğumu aşağıda ki komutla yapabiliyorum.

tar -tf dosya.tar.xz | grep "[/]$" | grep -v "/[a-z]\|/[0-9]" | awk -F/ '{print $1}'

Benzer birkaç komut daha ürettim ama tar 'ın kendisinde bu şekilde bir özellik var mı bulamadım.

Şu şekilde daha sade bir yapıda sonuç alabilir miyiz?
tar xxx dosya.tar.xz

Konu hakkında bilgisi olan var mıdır?

012rev3

"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

mhmtkrktr

#2
@012rev3, yanıt için teşekkürler.

O şekilde olmuyor. İçerisinde dizinlerin ve bu dizinlerin içinde dosyaların bulunduğu bir arşiv oluşturup iki komutu deneyebilirsen farkı daha rahat anlayabilirsin. Senin eklediğin verbose ilavesi içeriği daha ayrıntılı göstermeye yarıyor. Benim istediğim ise, içerikte bulunan ana dizinlerin adı. Dizinlerin içerisinde ki dosyaların isimlerini çıktıdan temizlemek yani.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 15 Kasım 2016 - 19:24:13


Yukarıda oluşturduğum düzen biraz fazla uzun. Aynı betikte, döngüler içerisinde bir çok kez tekrar etmem gereken bir durum var. Herbirisi için ayrı ayrı değişken oluşturmak yerine doğrudan döngünün içerisine yazmak daha cazip geliyor. Bu şekilde de çok estetik olmadı. Hani varsa tar ın bu şekilde bir kolaylığı, onu kullanayım demiştim.

bugra9

Yardım sayfalarında bunun için direk bir kullanım yok görünüyor. Bilmiyorum yardımcı olur mu ama egrep uygulaması ile düzenli ifade kullanıp daha kısa şekilde dizinleri yakalayabilirsin.

Tüm dizinleri listeleme;
tar -tf dosya.tar.xz | egrep "^.+/$"

Ana dizinleri listeleme;
tar -tf dosya.tar.xz | egrep "^[^/]+/$"

^: Satır başlangıcı
$: Satır sonu
.+: Her şey ile eşleşir
[^/]+: / karakteri içermeyen her şey ile eşleşir

012rev3

[mention=610669]@mhmtkrktr[/mention]
Pardon hocam konuyu yanlış anlamışım. Ben de bu kadar basit soru olamayacağını tahmin etmiştim aslında :)
"Her şey mümkün olduğunca basitleştirilmeli ancak sıradanlaştırılmamalıdır." Albert Einstein

illedelinux

Sizde farklı olabilir bilmiyorum ama arşivin üzerine ben sağ tık xarchver seçenegini seçtiğimde içinde ne var ne yok gösteriyor...
GNU/Linux kullanmıyorum, onu yaşıyorum...

mhmtkrktr

@buğra9 , teşekkür ederim. Bende bulamadım kısa bir yolunu. Oluşturduğum yöntemlerden bir tanesi bu. En kısa yolu da bu olabiliyor sanırım. İlave olarak sondaki slash larında olmaması gerekiyor bende. Arşiv içinde ki dizinleri bulup, sistem içinde ki aynı isimdeki dosyaları silmem gerekiyordu. Son hali şu şekilde oluyor bu durumda.

tar -tf ${variable}/dosya.tar.xz | egrep "^[^/]+/$" | cut -d / -f1

Birde şunu sorayım buna göre, aynı isme karşılık gelen dizini tamamen ezdirmenin bir yolu var mıdır? Biraz daha açarsak,
[1]
# arşiv.tar.xz
dizin/
dizin/dosya1
dizin/dosya2


[2]
# yerel içerik
dizin/
dizin/dosya1
dizin/dosya2
dizin/dosya3


[1] arşivi, [2] yerel içeriğin üzerine açarsak, dosya1 ve dosya2 içeriği ezilir. Fakat yerelde bulunan dosya3 yerinde kalacaktır. Benim amacım o dosya3 'ünde orada olmaması. Arşivi açarken tüm dizini ezdirebilsem,  bu şekilde de amaca uygun olur aslında.

@012rev3, rica ederim. Kurcalaya kurcalaya öğreniyoruz işte. :)
Araştırırken bir kaç yerde o şekli görmüştüm. Ne yalan söyleyeyim, oradaki her harfin ne işe yaradığını bile bile kendimde denemedim değil. :)

@illedelinux, bizde yatarken terminale sarılarak uyumuyoruz ama betik düzeninde işler öyle yürümüyor işte :)

bugra9

Sadece bul değil de bul-değiştir yapacaksak o zaman kullanacağımız uygulama sed oluyor. Kendisi çok güçlü olup hiç yardım almadan tüm metin üzerindeki işlemleri yerine getirebilir.
Daha anlaşılır olması için komutu aşama aşama oluşturuyorum. İki kullanım şekli sunacağım.

1) Bul, buldukların üzerinde tekrar bul ve bunu değiştir.
İlk aşama olarak "grep -E" yani egrep ile yaptığımız bulma işleminin aynısını sed ile yapalım. Aşağıdaki gibi olacaktır. Küçük bir not düşeyim grep uygulaması yanlış yazımları düzeltebilirken sed bunu yapmıyor, yani doğru şekilde yazmamız gerekiyor. Örneğin / karakterini \/ şeklinde yazarak kaçış yapmamız gerekiyor. Doğru kullanım budur.
Kullanım:
sed -nr "/Düzenliİfade/p"
Uygulanmış hali:
tar -tf ${variable}/dosya.tar.xz | sed -nr "/^[^\/]+\/$/p"
Şimdi bu bulduğumuz satırlar üzerinde / karakterini bulup bunu hiçbir şey ile değiştirelim.
Kullanım:
sed -nr "/Düzenliİfade/s/Aranacakİfade/NeİleDeğiştirilecek/p"
Uygulanmış hali:
tar -tf ${variable}/dosya.tar.xz | sed -nr "/^[^\/]+\/$/s/\///p"

2) Bul-Değiştir (Favorimdir)
Direk aramamızı yaparız ve ilgili yerleri değişkene atarız. Daha sonra tüm satırları bu değişkenler vasıtasıyla istediğimiz gibi değiştiririz. Değişkene atmak istediğimiz yeri "()" şeklinde küme parantezine alıp değişim yerinde bunları kullanmak için "\1" "\2" şeklinde yazarız.
Kullanım:
sed -nr "s/Düzenliİfade/NeİleDeğiştirilecek/p"
Uygulanmış hali:
tar -tf ${variable}/dosya.tar.xz | sed -nr "s/^([^\/]+)\/$/\1/p"

Alıntı YapBirde şunu sorayım buna göre, aynı isme karşılık gelen dizini tamamen ezdirmenin bir yolu var mıdır?
Aklıma bir yöntem gelmedi. Belki kullanılan sıkıştırma açma yöntemine (tar.gz, rar, zip, vs.) göre bu gerçekleştirilebilir. İstediğin formatı kullanabiliyor musun yoksa tar.xz ile sınırlı mı? Ona göre bakınayım.

mhmtkrktr

tar.xz mecburiyetim yok aslında. Arayüz kullanım pratikliğinden dolayı tüm arşivlerimi tar.xz olarak düzenliyorum ama diğer biçimlere de alabilirim.

Sed 'i kullanmak aklımın ucundan bile geçmemişti. Bu şekilde biraz daha kısa bir komut oldu. Tekrar teşekkür ederim.
Fakat şimdi baktım da, fonksiyonlar içerisinde çok fazla tekrarı olacak bu şekilde. Bu işlemi ayrı bir fonksiyona alıp onu çağırmak daha kolay olacak gibi. Fonksiyon çokluğunu ve içeriğinde yapılacak işlem yoğunluğunu ele alınca, senin komutu da alıp, şu şekilde düzenlemek benim için sorunun çözümü olacak,

konum[1]='arşivin bulunduğu konum' # sabit konum
## konum[2]='arşivin açılacağı konum'
## var[1]='arşiv adı'

delete_directory() { for list in `tar -tf ${konum[1]}/${var[1]}.tar.xz | sed -nr "s/^([^\/]+)\/$/\1/p"`; do
test -d ${konum[2]}/$list && rm -rf ${konum[2]}/$list ; done; }

prosess_function1() { if [[ -r ${konum[1]}/Arsiv.tar.xz ]]; then var[1]='Arsiv'; konum[2]='/etc'
delete_directory; sudo tar -Jxf ${konum[1]}/Arsiv.tar.xz -C ${konum[2]}; fi ; }
## ......
prosess_function99() { if [[ -r ${konum[1]}/Arsiv.tar.xz ]]; then var[1]='Arsiv'; konum[2]='/etc/systemd'
delete_directory; sudo tar -Jxf ${konum[1]}/Arsiv.tar.xz -C ${konum[2]}; fi ; }



bugra9

Rica ederim. Biraz bakındım da açarken direk ezdirmenin bir yolu görünmüyor. Yazdığın çözüm en temizi olmuş. Başlık çözüldü olarak etiketlendiğine göre başlığı kilitleyelim.