Nokta içermeyen dosya adlarına metin ekleyin


9

Aşağıdaki dosyalar göz önüne alındığında:

english_api
english_overview
style.css

Elde etmek istiyorum:

english_api.html
english_overview.html
style.css

Başka bir deyişle ., terminal kullanan bir dizinde dot ( ) içermeyen tüm dosyalara metin ekleme .

Açıkçası o klasörde çok fazla dosya var; Sadece örnek olarak 3 yazdım.

Ben, diyelim ki, o klasörde .cssile değiştirmek .htmlolsaydı, ben kullanmak istiyorsunuz:

rename .css .html *.css

Ama bir şey içermeyen dosyaları eşleştirmenin bir yolunu gerçekten düşünemiyorum. Ayrıca renamekomut kullanarak nasıl ekleme (vs değiştirme) ?

Yanıtlar:


13

Bu findkomutu deneyin ,

find . -type f ! -name "*.*" -exec mv {} {}.html \;

Geçerli dizinde mevcut olan dosya adlarında nokta içermeyen dosyaları bu filename.htmlformata ( en son eklenen.html ) yeniden adlandırır.

. -> Geçerli dizini temsil eder

-type f -> Bu işlemi sadece dosyalarda yapmak.

! -name "*.*" -> adlarında nokta bulunmayan dosyaların adını yazdırın.

-exec mv {} {}.html -> findkomutu ayıklanan dosya adlarında bu taşıma (veya) yeniden adlandırma işlemini gerçekleştirir.

\; -> findKomutun sonunu temsil eder .


6

Bash, sen kullanabilirsiniz genişletilmiş kabuk Neználkovo örn

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

( echodoğru kalıpla eşleştiğini onayladıktan sonra kaldırın ). Genişletilmiş globbing zaten etkin değilse ile etkinleştirebilirsiniz shopt -s extglob.

Başka bir seçenek de perl tabanlı renameişlevi değişmezi hariç tutan bir normal ifadeyle kullanmaktır.

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

( ndoğru kalıpla eşleştiğini onayladıktan sonra seçeneği kaldırın ).


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; donecommand dizinleri de yeniden adlandırır.
Avinash Raj

2

Böyle durumlarda tercih ederim mmv. Ubuntu'da varsayılan olarak yüklenmez, ancak sudo apt-get install mmvkomutu kullanarak yükleyebilirsiniz .

Sizin durumunuzda iki kez kullanmanız gerekir:

  1. .htmlHer dosya adının sonuna ekleyerek geçerli dizindeki tüm dosyaları yeniden adlandırın :

    mmv -v '*' '#1.html'
    
  2. Daha önce adlarında bir veya daha fazla .(nokta) olan tüm dosyaları yeniden adlandırın (geri ):

    mmv -v '*.*.html' '#1.#2'
    

Veya tek bir satırda:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-vseçeneği zorunlu değildir. Sadece ayrıntılı bir çıktı için kullanıyorum çünkü mmvsessizce eylemleri gerçekleştirmiyor.

Daha man mmvfazla bilgi için bakınız .


1

Perl rename komutuyla ( prename), dosya adının bir nokta içermesi gereken bir koşul ekleyebilirsiniz. Perl snippet'i bir dosyanın adını değiştirmezse, o dosyaya dokunulmaz. İşte bunu yazmanın birkaç yolu:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

Cevaplar mükemmel, ben de bu işi yapan başka bir komut vermek:

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

Bazı açıklamalar:

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

NOT :

Senaryonuzu deniyorum ve komut işi yapıyor.


6
Bu, herhangi bir boşluk alanı (boşluklar, sekmeler, yeni satırlar vb.) İçeren dosya adlarında başarısız olur. Genel bir kural olarak, asla ayrışmamalısınızls .
terdon

Bu doğru terdon yorumunuz için teşekkür ederim, ama bunu aynı komutta nasıl çözebilirim
nux

3
Gerçekten yapamazsın. L'leri ayrıştırmak için neredeyse güvenli bir yol yoktur . Gerçekten awkve kullanarak yapmak istiyorsanız sh, gibi bir şey deneyin printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Bu, yeni satırlı dosya adlarını yine de keser, ancak en azından boşluklarla başa çıkabilir. --Eğer dosya adları ile başlayan kasalar için gereklidir -.
terdon
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.