kopyalama sırasında dosyaları nasıl yeniden adlandırabilirim?


12

Rastgele dize bölümünü addan kaldırmak için her dosyayı yeniden adlandırırken (örneğin, -2b0fd460_1426b77b1ee_-7b8e) yedek dizindeki tüm dosyaları kullanıcının dizinine nasıl kopyalarım (örneğin, stil değiştirilmez)?

cp kaynağı:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

için:

/home/user/data/Erp.2014.02.16_16.57.03.etf

Her dosya her zaman "Erp" ile başlayacaktır. ardından tarih-zaman damgası dizesini, ardından rastgele dizeyi ve ardından ".etf" uzantısını takip eder. Tarih-zaman damgası da dahil olmak üzere tüm ad öğelerini saklamak istiyorum. Sadece rastgele dizeyi kaldırmak istiyorum.

Rastgele dize, aynı dosyanın birden çok yedeklemesine izin verir. Ancak, bu durumda, ben sadece fdupes koştu ve hiçbir kopyaları yoktur. Böylece rastgele dizeyi kaldırarak tüm dosyaları geri yükleyebilirim.

Bunu yapmak için tek satırlık bir bash komutu arıyorum.

Bu işe yaramazsa, iki veya daha fazla adımda yapabilirim. Normalde KRename kullanıyorum, ancak bu durumda bash'de yapmam gerekiyor. (Uzaktan çalışıyorum.)

Yanıtlar:


7

paxhepsini bir kerede yapabilir. Şunları yapabilirsiniz:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxvarsayılan olarak süreleri korur, ancak -peher şeyi korumak (en iyi kök olarak yapılır) veya -ppizinleri korumak için ekleyebilir , örn:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

Aksi takdirde ( paxgenellikle varsayılan olarak kullanılamaz), elbette bir kopya yapmak daha iyidir rename:

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

Bu şekilde, her dosya için farklı bir işlem başlatılmaz.


1
Aşina olmam gerektiğini görebiliyorum pax. Bu çok kullanışlı bir araç gibi görünüyor. Neden daha fazla dağıtımda standart olmadığını merak ediyorsun ...
MountainX

@MountainX, Wikipedia'ya göre iyi bir soru, pax2005'ten beri Linux Standard Base'de bulunuyor. Ayrıca bunun alternatifi olan GNU cpio, muhtemelen var olan en az özellikli GNU aracıdır.
Graeme

1
Son çözümünüz için +1 ve Bu şekilde her dosya için farklı bir işlem başlatılmaz. Ancak rename Fedora / Red Hat için farklı: Bu durumda nasıl kullanılacağını bilmiyorum.
erik

15

Sen kullanabilirsiniz cpile komutu -aseçeneği

-a, --archive
       same as -dR --preserve=all

Ve sonra tüm dosyaları kopyalarken yeniden adlandırmak için bir for döngüsü kullanın:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

Hazır. Bu komutu kaynak dizinde başlatın.

Açıklama:%%-* tire ilk oluşumu sonrasında tüm karakterleri keseceğim / eksi -ve .etfsonunda yine dosya uzantısını ekler.

Ve bir astar olarak, hepsini tek bir satıra koyun. :-) Bunun gibi

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
Teşekkürler, %%-*bahşiş için belgeleri lütfen teklif edebilir misiniz ? Merak ediyorum.
soyuka

3

Zsh'de kullanın zmv. Bunu şuna ekle .zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

Sonra kullan

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Bash'da:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

Zsh'niz yoksa, bir POSIX yolu pax kullanır (bu dizinleri özyinelemeli olarak kopyalar).

Zsh ve pax içermeyen kısıtlı bir sistemdeyseniz, bir döngü kullanabilirsiniz:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cpbu yeteneğe sahip değil. Bunu cpioyapabildiğimi hatırlıyorum , ama şu anki sayfa aksini söylüyor. Ancak, (gnu) 'nun tarbir --transformseçeneği vardır:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

Yani bir cmdline'ınız olur:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
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.