Automator :: Dosya adından 6 basamaklı tarihi kaldır; geçerli tarihi ekle


3

Bu cevap verildiyse ancak bir çözüm umuduyla uzunca bir arama yaptıysanız şimdiden özür dilerim.

Geçerli altı basamaklı tarihi (YYMMDD) dosya adının sonuna ekleyen çalışan bir Automator uygulamasına sahibim:

  • Giriş: Dosyaadı.txt
  • Çıktı: Dosyaadı_181212.txt

Geçerli bash komutu:

today=$(date +%y%m%d)
for f in "$@"
do
    basename=${f##*/}
    filename=${basename%.*}
    path=${f%/*}
    ext=${f##*.}
    newfilename="$filename"_"$today"
    mv "$f" "$path"/"$newfilename"."$ext"
done

Bu harika, ancak düzenli kullandıktan sonra, sadece geçerli tarihi eklemekle kalmayıp, aynı zamanda zaten bir dosya adına eklenip eklenmediğini görmek için kontrol etmenin iyi olacağını fark ettim; öyleyse, kaldırın ve geçerli tarihi ekleyin, aksi takdirde geçerli tarihi ekleyin.

İki senaryo var:

  1. Dosya adı, daha önce bir alt çizgi tarafından belirtilen 6 basamaklı biçimde (önceki / geçerli / gelecek) herhangi bir tarih içeriyor (Dosyaadı_181212.txt)
  2. Dosya adı, kendisine eklenmiş 6 basamaklı tarih biçiminde içermiyor (Dosyaadı.txt)

Beklediğim çözümün, tarih olsun ya da olmasın, altı basamağı ve önceki "_" harflerini kaldıracağını fark ediyorum.

Mevcut bash komutumdan önce şöyle bir şey olabilir mi?

dosya uzantısından hemen önce herhangi bir sayı kombinasyonu varsa (".ext") VE tam olarak 6 rakam içeriyorsa VE önce bir alt çizgi ("_") gelir

daha sonra alt çizgi artı 6 haneyi kaldırın VE yukarıda listelenen bash komutunu çalıştırın

değilse, yukarıdaki bash komutunu çalıştırın.

Özet Geçerli tarihi eklemeden önce bir dosya adında olabilecek tarihleri ​​kaldırarak el ile hafifletmeye çalışıyorum. Bazı dosyaların tarihleri ​​olabilir, bazıları ise olmayabilir.


Evet, ancak bu durumda, tarih komutu ilgisizdir, çünkü geçmiş, önceki veya gelecekteki bir tarih olup olmadığına bakılmaksızın sadece 6 rakamın (artı önceki alt çizgi) bulunması gerekir.
Jeremy W,

üzgünüm, aptalca olduğumu anlatan yorumumu sildim.
Ruskes

Dosya adındaki tarih Tarih değil, sadece düz metin (sayı) ama tarih olarak görüyoruz. Yani dosya adındaki tüm sayıları silerseniz işe yarar mı?
Ruskes

Buna inanıyorum, ancak "_" nin de kaldırılması gerekecek çünkü geçerli tarih eklendiğinde biri eklenecek. Hatırlatma olarak, tarih yoksa, hiçbir şey kaldırılmaz; sadece tarih ekleyen komuta geçer (şu an sahip olduğum).
Jeremy W

İstediğiniz oldukça cerrahi bir işlem. Ve sadece dosya adını silmek ve tarih ile değiştirmek sizin için bir seçenek değilse değiştirmektir.
Ruskes

Yanıtlar:


2

Bu istediğin gibi yapmalı:

#!/bin/bash

today=$(date +%y%m%d)

for f in "$@"; do

    filebasename=${f##*/}
    filename=${filebasename%.*}
    path=${f%/*}
    ext=${f##*.}

    if [[ "$filename" =~ ^.*_[0-9]{6}$ ]]; then

        filename="$(sed -E -e 's/_[0-9]{6}$//'<<<"$filename")"

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"   

    else    

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"

    fi

done

Bir dahilinde kullanıldığında unutmayın çalıştırın Kabuk Senaryo eylem bir in Otomatikleştirici iş akışı , tam eklemek gerekebilir yolunu için sedde kod sağlanan örn:/usr/bin/sed


Tamam. Netlik için, 'basename' değişkenini (ve 'dosyaadı' değişkenindeki referansını) 'filebasename' gibi bir şeyle değiştirirsem, doğrudan terminalde veya komut satırında kullanılırsa bir çakışma olmamalıdır?
Jeremy W,

@ Jeremy W, Evet, mevcut bir komut isminden başka bir şeyle değiştirmek, yapmak için iyi bir şey, 'filebasename' iyi veya bu kullanım durumunda tam olarak "baesname" den başka bir şey. İlk yazdığın gibi bıraktım, böylece var olan koduna hangi kodu eklediğimi daha kolay görebilirsin. Şimdi cevabımda güncelleyeceğim, farkında olduğunu biliyorum. Ayrıca, güncellenmiş nota bakın.
user3439894
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.