Tek bir komutla bir klasördeki tüm dosyaları bir önekle yeniden adlandırın


Yanıtlar:


108

Dosya adlarınız beyaz alan içermiyorsa ve herhangi bir alt dizine sahip değilseniz, basit bir fordöngü kullanabilirsiniz :

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

Aksi takdirde rename(bir perl betiğidir) uygun komutu kullanın - her Unix'te kutunun dışında bulunmayabilir (örneğin, OS X ile birlikte gelmez rename).

Debian-administration.org'da kısa bir genel bakış:

Dosya adlarınız boşluk içeriyorsa, kullanımı daha kolaydır find, Linux'ta aşağıdakiler çalışmalıdır:

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

BSD sistemlerinde -printfmaalesef seçenek yoktur . Ancak GNU findutils kurulabilir olmalıdır (örneğin Mac OS X ile brew install findutils).

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

@Matteo: Teşekkürler ipucu: cevabımı bir uyarı ve iki örnekle güncelledi find.
miku

Ayrıca for f in *; do [[ -f ${f} ]] && mv ...; doneyalnızca dosyaları (alt dizinler, bağlantılar vb.
Yok

1
Değişkenleri gerektiği gibi alıntı yaparsanız for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done, dosya adlarında hangi karakterlerin bulunduğuna bakılmaksızın doğru çalışır. Dizinleri, soketleri, sembolik bağları ve diğer dosya türlerini de taşır; Bunun önemli olmadığını varsayıyorum.
Jonathan Leffler

Her nasılsa bu, .tüm dosyalarımdan önce bir ekledi
nullability

77

Dosyaların bulunduğu klasördekirename komutu deneyin :

rename 's/^/Unix_/' *

Yeniden adlandırma bağımsız değişkeni ( sed s komutu ) ^ normal ifadesinin Unix_ ile değiştirileceğini gösterir . Düzeltme işareti (^), satırın başlangıcı anlamına gelen özel bir karakterdir .


9
Ne anlama 's/^/.../'geldiğini açıklayabilir misin ?
mcont


bu harika! / * klasörünü eklemenizi öneririm, çünkü komut yanlışlıkla başka bir yerde tekrarlanırsa * biraz tehlikelidir
Systems Rebooter

brew install rename @OliverPearmain
Felipe Plazas

rename 's/^start_/run_' *
Ön ekin


17

Geçenlerde aynı durumla karşılaştım ve daha kolay bir dahili çözüm buldum. Çözüm arayan diğer insanlara yardımcı olması için onu burada paylaşıyorum.

Apple, OS X Yosemite ile toplu yeniden adlandırma yeteneklerini doğrudan Finder'a entegre etti. Ayrıntılı bilgi burada mevcuttur . Aşağıdaki adımları da kopyaladım,

Birden çok öğeyi yeniden adlandırın

  1. Öğeleri seçin, ardından bunlardan birine Kontrol tuşuna basarak tıklayın.

  2. Kısayol menüsünde Öğeleri Yeniden Adlandır'ı seçin.

  3. Klasör Öğelerini Yeniden Adlandır'ın altındaki açılır menüde, adlardaki metni değiştirmeyi, adlara metin eklemeyi veya ad biçimini değiştirmeyi seçin.

    • Metni değiştirin: Kaldırmak istediğiniz metni Bul alanına girin, ardından eklemek istediğiniz metni "Değiştir" alanına girin.

    • Metin ekle: Alana eklemek istediğiniz metni girin, ardından metni mevcut adın önüne veya arkasına eklemeyi seçin.

    • Biçim: Dosyalar için bir ad biçimi seçin, ardından dizini, sayacı veya tarihi adın önüne veya arkasına koymayı seçin. Özel Biçim alanına bir ad girin, ardından başlamak istediğiniz numarayı girin.

  4. Yeniden Adlandır'ı tıklayın.

Dosyalarınızda Metni değiştir'i kullanabileceğinizden daha yaygın bir model varsa, aksi takdirde Metin ekle de işi yapar.


1
Mükemmel - bana çok zaman kazandırdı!
user3000868

7

Bunun -iyerine kullanabilirsiniz-I {}

ls | xargs -i mv {} unix_{}

Bu da mükemmel çalışıyor.

  • ls - dizindeki tüm dosyaları listeler
  • xargs- -iseçenek nedeniyle tüm dosyaları satır satır kabul eder
  • {}tüm dosyalar için yer tutucudur, xargsgirdi olarak ikiden fazla argüman alırsa gereklidir

Awk kullanarak:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-ikullanımdan kaldırıldı, şimdi sadece-I
JamPow

Debian 8'de bana yardımcı oldu. Thaks
Abror Esonaliev

2

Ayrıca boşluklu öğeler için çalışır ve dizinleri yok sayar

for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done

1

İle mM'lik (yüklemeniz gerekir):

rnm -ns 'Unix_/fn/' *

Veya

rnm -rs '/^/Unix_/' *

Not: Bu aracın yazarıyım.


2
Yardımcı programınızla ilgili tüm yanıtlarınızı gözden geçirmeli ve yazarı olduğunuz feragatnameyi eklemelisiniz.
Mogsdad

@Mogsdad: Bunun gerekli bir bilgi olduğunu sanmıyorum. Birisi yazarı bulmak isterse, bu oldukça kolaydır.
Cahid

Bu araç için teşekkürler. Nedense renamebenim için çalışmıyor ama çalışıyor rnm.
aloso

0

Durum:

Biz certificate.key certificate.crtiçeride/user/ssl/

Biz başlayan herşeyi adlandırmak istediğiniz certificateiçincertificate_OLD

Şimdi içerideyiz /user

İlk olarak, şunlarla kuru bir çalışma yaparsınız -n:

rename -n "s/certificate/certificate_old/" ./ssl/*

Hangi döndürür:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

Dosyalarınız değiştirilmeyecek, bu sadece bir test çalıştırmasıdır.

Çözüm:

Testin sonucundan memnun kaldığınızda, gerçekten çalıştırın:

rename "s/certificate/certificate_OLD/" ./ssl/*

Ne demek:

"s / SOMETHING / SOMETING_ELSE" PATH / DOSYALARI yeniden adlandır

İpucu:

Zaten yoldaysanız, şu şekilde çalıştırın:

rename "s/certificate/certificate_OLD/" *

Veya bunu do ile başlayan herhangi bir alt dizinde ssyapmak istiyorsanız:

rename -n "s/certificat/certificate_old/" ./ss*/*

Şunları da yapabilirsiniz:

rename -n "s/certi*/certificate_old/" ./ss*/*

Hangi certialt dizinde ile başlayan her şeyi yeniden adlandırır ss.

Gökyüzü, limittir.

Normal ifadeyle oynayın ve HER ZAMAN bunu ÖNCE ile test edin -n.

BUNUN EŞLEŞEN KLASÖR ADLARINI YENİDEN ADLANDIRACAĞINI İZLEYİN. Daha iyi cddizine girin ve orada yapın. RİSK SİZE AİTTİR.


0

find -execdir rename

Bu, dosyaları ve dizinleri yalnızca taban adlarını etkileyen bir normal ifade ile yeniden adlandırır.

Yani bir önek için şunları yapabilirsiniz:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

veya yalnızca dosyaları etkilemek için:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdircdsadece taban adı üzerinde çalıştırmadan önce dizine ilk s.

Bunu daha ayrıntılı olarak şu adreste açıkladım: Birden çok dosyayı bulun ve Linux'ta yeniden adlandırın

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.