ilk 10 karakteri bozulmadan tutarak bir dosyayı yeniden adlandır


1

Örneğin dosya isimleri şöyle:

Order21039 Internal Document.doc
Order33920 New Order.doc
Order39307 Exam.doc
.
.
.

İlk on karakteri saklamak ve başka bir metin eklemek istiyorum:

Order21039.test.doc
Order33920.test.doc
.
.
.

FreeBSD için en iyi ve en kolay yöntem nedir?

Yanıtlar:


4

İle zsh:

autoload zmv # best in ~/.zshrc
zmv -n '(?(#c10))*.doc' '$1.test.doc'

( -nmutlu olduğunda çıkarın ).

Bunu şu şekilde değiştirebilirsiniz:

zmv -n '(Order<->)*.doc' '$1.test.doc'

Order<anydecimalnumber>Sadece 10 karakter yerine eşleşmek için .

Yeniden perladlandırmakla:

rename -n 's|^\./.{10}\K.*\.doc|.test.doc|s' ./*.doc

(bunun aksine zmv, aynı dosyaya eşlenen birkaç dosyaya karşı koruma sağlamayacağına dikkat edin )

Bunlardan hiçbirine sahip değilseniz, FreeBSD'ler gibi bir POSIX benzeri kabukla /bin/sh:

for file in ??????????*.doc; do
  newfile=${file%"${file#??????????}"}.test.doc
  echo mv -i -- "$file" "$newfile"
done

( echomutlu olduğunda çıkarın ).

Herhangi bir Bourne benzeri kabukla:

for file in ??????????*.doc; do
  newfile=`expr " $file" : ' \(.\{10\}\)'`.test.doc
  echo mv -i -- "$file" "$newfile"
done

İlki benim için çalıştı. Cevabınız için teşekkürler .. zmv'yi daha iyi öğrenmeliyim.
Plato

2

biraz kabuklu bir döngü için basit sed:

for file in *
do
echo mv "$file" `echo "$file" | sed -e 's/\(.\{10\}\).*.\(.\{3\}\)/\1.test.\2/'`
done

Eğer çıkışı ile mutlu ise kurtulmak echoönce mv.

Bu dizindeki tüm dosyaları işleyecek ve üç karakter uzunluğunda dosya isimleri için çalışacaktır.


1
(varsayarak dosya adları boşluk, sekme, yeni satır, joker, muhtemelen ters eğik çizgi karakterleri içermeyen ve ile başlamayın -; ayrıca dikkat .içinde \(.\{3\}\)sadece herhangi bir karakterle eşleşir değil .).
Stéphane Chazelas

1

Bazı işletim sistemlerine bağlı olarak bir dizi çözüm vardır:

Rename multiple files, groups of files

        1) rename -- Debian version and RedHat version differ, q.v.
           (try package util-linux:
           http://en.wikipedia.org/wiki/Util-linux)

        2) ren -- RedHat relatives

        3) renameutils -- package contains qmv, imv, icp, qcp, and deurlname

        4) mved -- (circa 2006; good as of 2015.05), perl
           http://raf.org/mved/
           (An earlier shell version may be available.)

        5) rename -- perl builtin library routine (DIY)

        6) mmv -- move/rename/copy/append/link multiple files by wildcard patterns

        7) gprename - batch rename using a GUI

        8) krename - batch rename using a GUI

Örneğin, s1 dosyasındaki bu kod silindiğini gösterir:

# Set up environment.
pl " Input data file of names $FILE:"
head $FILE


i=0
while IFS='' read -r file
do
  (( i++ ))
  # echo " Name $i: $file"
  touch "$file"
done < $FILE

pl " Files to consider renaming:"
ls -1 *.doc

pl " Expected output:"
cat $E

# "Order21039 Internal Document.doc" -> "Order21039.test.doc"
pl " Verbose execution and file list:"
mved -v "??????????*.doc" ==========.test.doc
pe
ls -1 *.doc

üretir:

 Input data file of names data1:
Order21039 Internal Document.doc
Order33920 New Order.doc
Order39307 Exam.doc

-----
 Files to consider renaming:
Order21039 Internal Document.doc
Order33920 New Order.doc
Order39307 Exam.doc

-----
 Expected output:
Order21039.test.doc
Order33920.test.doc
Order39307.test.doc

-----
 Verbose execution and file list:
mv Order21039 Internal Document.doc Order21039.test.doc
mv Order33920 New Order.doc Order33920.test.doc
mv Order39307 Exam.doc Order39307.test.doc

Order21039.test.doc
Order33920.test.doc
Order39307.test.doc

Gibi bir sistemde:

OS, ker|rel, machine: FreeBSD, 11.0-RELEASE-p9, amd64
bash GNU bash 4.4.12

(Perl) kodunun bazı ayrıntıları silindi:

mved    carefully rename multiple files (man)
Path    : ~/bin/mved
Version : 1.4
Length  : 495 lines
Type    : Perl script, ASCII text executable
Shebang : #!/usr/bin/env perl
Help    : probably available with -h
Home    : http://raf.org/mved/ (doc)
Modules : (for perl codes)
 warnings       1.23
 strict 1.08
 Getopt::Std    1.10

Taşınacak çağrı dizisi, ilk ifadedeki joker karakter eşleşmesinin karşılık gelen sonucunu gösteren yerel bir "joker karakter", "=" içerir.

şerefe, drl


1
Üzgünüz, hatalıysam beni düzeltin. "Rm -f * .doc", tüm dosyalarımı yeniden adlandırmadan önce siler mi?!?
Plato

Evet. Bu bir demo, bu yüzden bütün kargaşayı temizlemek istedim. Karışıklık için özür dilerim, ve bunu gösterdiğiniz için teşekkürler ... şerefe, drl
drl

@terdon - Bu düzenlemeye dikkat ettiğin için teşekkürler ... Şerefe,
drl
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.