Birden çok dizinin ismini değiştirme


2

Kayıt tarihlerine göre kayıtları saklayan bir dizin yapısına sahipseniz. Başlangıçta böyle her gün için bir alt dizin içeren bir dizin vardı.

  • basedir
    • 2010-01-01
      • birden fazla dosya ve bazen alt dizinler
    • 2010-01-02
    • ...
    • ...
    • 2014/12/15

Bu, konfor için fazla büyüdüğü için, biraz hareket etmeye karar verdim ve bununla sonuçlandım:

  • basedir
    • 2010
      • 01
        • 2010-01-01
        • 2010-01-02
        • ...
        • 2010-01-31
      • 02
        • 2010-02-01
        • 2010-02-02
        • ...
        • 2010-02-28
      • 03
      • ...
    • 2011
    • ...
    • 2014

Bu yüzden bugünün verilerini elde etmek için bakacağım basedir/2014/12/2014-12-15/

Tüm tarih alt dizinlerinin adlarını sadece ayın gününe sahip olacak şekilde yeniden adlandırmak istiyorum. Bugünün verileri daha sonra bulunur basedir/2014/12/15/.

Bunu başarmanın kolay yolu nedir?


Bazı etrafa baktıktan sonra find, bana özellikle aradığım dizinleri veren bir regex yarattım , böylece işleri karıştırmak da değişiyor.

find . -type d -regextype posix-extended -regex '.*/(20[0-9]{2})/(0[1-9]|1[0-2])/\1-\2-(0[1-9]|[1-2][0-9]|3[0-1])'

Yanıtlar:


3

İşte bir astar:

find -mindepth 3 -maxdepth 3 -type d | while read -r name; do
  mv -v "$name" "${name/????-??-}"; done

idam edilecek basedir.

Satır sonu sadece okunabilirlik içindir, teknik olarak tek astardır.

Çalıştırmadan önce bir yedekleme oluşturmanızı şiddetle tavsiye ederim. Bu komut akıl sağlığı kontrolünden geçmez. Keyfi ağaçlarda çalıştırmak hiç güvenli değil. Aynı "tarih" kısmına sahip olan direklerle karışacak. Dizin isimlerinde boşluk olduğu zaman kırılacak.

Ancak, bir kereye mahsus olmak üzere, dosya adlarının aklı başında olduğunu bildiğiniz veriler üzerinde, yedekleme ve sonradan manuel doğrulama ile bir kez kullanmak yeterince güvenlidir.

"${name/????-??-}"Bölüm bash özeldir. Diğer mermilerde işe yaramayabilir. Parametre genişletme işlevinde arama ve değiştirme denir .


Parametre genişletmedeki bu arama ve değiştirme çok hoş! Ne yapmaya çalıştığını biliyorum ama işe yaramadı. Tek bir dosya ile test yaptım: testdir / 2014/12 / 2014-12-15 / dummy.dat ve "Böyle bir dosya veya dizin yok" diye şikayet ediyor. Daha fazla akıl sağlığı kontrolleri için İşe yarayan bir regex oluşturdum, sorumu ekleyeceğim.
DeltaLima

Find string'imi while döngüsüyle birleştirdiğimde işe yarıyor! Teşekkürler
DeltaLima

Bence orijinal cevabı işe yararsa işe yarayacağını düşünüyorum -type d. Bulunan yollarda boşluklar varsa ihtiyaç duyacağıwhile name="$(line)"; do ...
AFH

Sorudaki değişiklikleri yansıtacak şekilde cevabı güncelledim.
lesmana,
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.