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.