Birincisi, bunu yapmanın en kolay yolunun, ilk ad veya komutları yeniden adlandırmak olduğunu söylemeliyim.
Ubuntu, OSX (Homebrew paketi rename
, MacPorts paketi p5-file-rename
) veya perl yeniden adlandırmalı (ön ad) diğer sistemlerde:
rename s/0000/000/ F0000*
veya RHEL gibi, util-linux-ng'den yeniden adlandırılmış sistemlerde:
rename 0000 000 F0000*
Bu, eşdeğer sed komutundan çok daha anlaşılır.
Ancak sed komutunu anlamak için, sed manpage yardımcı olur. Man sed'i çalıştırırsanız ve & öğesini ararsanız (aramak için / komutunu kullanarak), bunun s / foo / bar / replaceements içinde özel bir karakter olduğunu görürsünüz.
s/regexp/replacement/
Attempt to match regexp against the pattern space. If success‐
ful, replace that portion matched with replacement. The
replacement may contain the special character & to refer to that
portion of the pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding matching
sub-expressions in the regexp.
Bu nedenle, \(.\)
referans alınabilecek ilk karakterle eşleşir \1
. Daha sonra .
her zaman 0 olan bir sonraki karakterle \(.*\)
eşleşir. Ardından dosya adının geri kalanıyla eşleşir ve bu karakter tarafından başvurulabilir \2
.
Yerini alan dize, &
(orijinal dosya adı) kullanarak hepsini bir araya getirir ve \1\2
bu, 0 olan 2. karakter dışında dosya adının her bölümüdür.
Bu, bunu yapmanın oldukça şifreli bir yolu, IMHO. Herhangi bir nedenle yeniden adlandırma komutu mevcut değilse ve yeniden adlandırmak için sed'i kullanmak istediyseniz (veya belki yeniden adlandırmak için çok karmaşık bir şey yapıyordunuz?), Normal ifadenizde daha açık olmak onu çok daha okunaklı hale getirecektir. Belki şöyle bir şey:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
S / search / replace / içinde gerçekte neyin değiştiğini görebilmek, onu çok daha okunaklı hale getirir. Ayrıca yanlışlıkla iki kez çalıştırırsanız dosya adınızdan karakterleri emmeye devam etmez.