Bir klasör içindeki tüm dosyaları önek ile yeniden adlandırın "Unix_"
Bir klasörde iki dosya olduğunu varsayalım
a.txt
b.pdf
sonra her ikisi de tek bir komuttan şu şekilde yeniden adlandırılmalıdır:
Unix_a.txt
Unix_b.pdf
Bir klasör içindeki tüm dosyaları önek ile yeniden adlandırın "Unix_"
Bir klasörde iki dosya olduğunu varsayalım
a.txt
b.pdf
sonra her ikisi de tek bir komuttan şu şekilde yeniden adlandırılmalıdır:
Unix_a.txt
Unix_b.pdf
Yanıtlar:
Dosya adlarınız beyaz alan içermiyorsa ve herhangi bir alt dizine sahip değilseniz, basit bir for
dö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 -printf
maalesef 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
find
.
for f in *; do [[ -f ${f} ]] && mv ...; done
yalnızca dosyaları (alt dizinler, bağlantılar vb.
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.
.
tüm dosyalarımdan önce bir ekledi
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 .
's/^/.../'
geldiğini açıklayabilir misin ?
's/^/.../'
, yeniden adlandırma komutu
rename 's/^start_/run_' *
Sanırım tam da aradığınız şey bu:
ls | xargs -I {} mv {} Unix_{}
Evet, basit ama zarif ve güçlü ve aynı zamanda tek astarlı. Sayfada benden daha ayrıntılı tanıtım alabilirsiniz: Dosyaları ve Dizinleri Yeniden Adlandır (Önek Ekle)
ls
- dosya adlarında boşluklar veya diğer garip karakterler varsa sorunlara yol açabilir.
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
Öğeleri seçin, ardından bunlardan birine Kontrol tuşuna basarak tıklayın.
Kısayol menüsünde Öğeleri Yeniden Adlandır'ı seçin.
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.
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.
Bunun -i
yerine kullanabilirsiniz-I {}
ls | xargs -i mv {} unix_{}
Bu da mükemmel çalışıyor.
ls
- dizindeki tüm dosyaları listelerxargs
- -i
seçenek nedeniyle tüm dosyaları satır satır kabul eder{}
tüm dosyalar için yer tutucudur, xargs
girdi olarak ikiden fazla argüman alırsa gereklidirAwk kullanarak:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
kullanımdan kaldırıldı, şimdi sadece-I
Ayrıca boşluklu öğeler için çalışır ve dizinleri yok sayar
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
İle mM'lik (yüklemeniz gerekir):
rnm -ns 'Unix_/fn/' *
Veya
rnm -rs '/^/Unix_/' *
Not: Bu aracın yazarıyım.
rename
benim için çalışmıyor ama çalışıyor rnm
.
Durum:
Biz certificate.key
certificate.crt
içeride/user/ssl/
Biz başlayan herşeyi adlandırmak istediğiniz certificate
iç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 ss
yapmak istiyorsanız:
rename -n "s/certificat/certificate_old/" ./ss*/*
Şunları da yapabilirsiniz:
rename -n "s/certi*/certificate_old/" ./ss*/*
Hangi certi
alt 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 cd
dizine girin ve orada yapın. RİSK SİZE AİTTİR.
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_/' '{}' \;
-execdir
cd
sadece 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