Linux'ta dosyaları tekrar tekrar adlandır (uzantıyı değiştir)


22

Bir dizindeki tüm dosyaları, binlerce alt klasördeki binlerce dosya için yinelenerek bir dosya uzantısını diğerine değiştirerek nasıl yeniden adlandırabilirim? Neredeyse istediğimi yapan, ancak tam olmayan bir çok komut görüyorum.

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile

1
Debian renameveya Red Hat var renamemı?
Ignacio Vazquez-Abrams,

@Ignacio: Ubuntu = Debian?
Endolit

Evet, Ubuntu bir Debian türevidir.
Ignacio Vazquez-Abrams,

Yanıtlar:


23

Anladım

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

Tabii ki -v'yi gerçekten kaldırırken çıkarın, yoksa tüm dosyaları göstererek zaman harcar.


14

Gibi bir şey:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;

bu benim için en iyi çalıştı
cwd


4

Bu yöntemin okunmasının daha kolay ve daha kolay olduğunu gördüm:

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

En azından Ubuntu türevlerinde yeniden adlandırma, hiçbiri komut satırında değilse, STDIN dosyalarının bir listesini alır. Ve bu kolayca ile test edilebilir:

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

Doğru olana kadar.


1

Dosya ve klasörleri yeniden adlandır find -execdir | rename

Hem dosyaları hem de dizinleri sadece bir sonek ile değil, yeniden adlandıracaksanız, bu iyi bir kalıptır:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find . -depth -execdir rename 's/findme/replaceme/' '{}' \;

Awesome -execdirseçeneği cd, renamekomutu çalıştırmadan önce dizine a yapar -exec.

-depth eksik ebeveyn dizinleri ile ilgili olası sorunları önlemek için yeniden adlandırma işleminin önce çocuklar üzerinde, sonra ebeveynler üzerinde yapıldığından emin olun.

-execdir Yeniden adlandırma, temel ad değil giriş yollarıyla iyi çalışmadığından, örneğin aşağıdakilerin başarısız olması gerekir:

rename 's/findme/replaceme/g' acc/acc

Bilgisayar PATHkorsanlığı gereklidir, çünkü -execdirçok can sıkıcı bir dezavantajı vardır: findson derece tartışılır ve ortam değişkeninizde -execdirgöreceli yollarınız varsa PATH, örneğin ./node_modules/.bin:

find: './node_modules/.bin' göreceli yolu, find -execdir eylemiyle birlikte güvensiz olan PATH ortam değişkenine dahil edilir. Lütfen bu girişi $ PATH içinden kaldırın

Ayrıca bakınız: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378

-execdirPOSIX için bir GNU bulma uzantısıdır . renamePerl tabanlıdır ve renamepaketten gelir . Ubuntu 18.10'da test edilmiştir.

Lookahead geçici çözümünü yeniden adlandır

Girdi yollarınız gelmiyorsa findveya göreceli yol sıkıntısından yeterince kurtulduysanız, dizinleri aşağıdaki gibi güvenli bir şekilde yeniden adlandırmak için bazı Perl görünümlerini kullanabiliriz:

git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'

Ben için uygun bir analog bulamadık -execdirile xargs: Xargs: değişim yürütmeden önce dosya yoluna dizini çalışma?

sort -rUzun yollar aynı öneki ile kısa olanlar sonra gel beri dosyaları kendi dizinleri sonra gelmek sağlamak için gereklidir.

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.