Toplu metin dosya adlarına nasıl hazırlanır?


44

Diyelim ki .mdçeşitli şeyler adında dosyalarla dolu bir dizinim var . Her dosya adının önüne "metin" hazırlamak istediğimi varsayalım. Yani örneğin: dosyası a.md, b.mdve c.mdolacak test - a.md, test - b.mdve test - c.md.

Bunu komut satırı ile nasıl başarırdım?

Yanıtlar:


60

Doğrudan terminalden kolayca yazılabilen tek astar:

for f in *.md; do mv "$f" "test - $f"; done

Veya noktalı virgül kullanarak ayrı satırlara yeniden yazılmış:

for f in *.md
do
    mv "$f" "test - $f"
done

sergi

Sözdizimi for(içinde sh):

for NAME [in WORDS ... ] ; do COMMANDS; done

Burada, bizim NAMEis fve WORDSgeçerli dizin eşleştirme bulunan tüm dosyaları *.md. Böylece değişken $fher dosya eşleştirmesiyle değiştirilecektir *.md.

Yani a.md:

mv "$f" "test - $f"

olur

mv "a.md" "test - a.md"

Her dosya adı $fboşluk içerebileceğinden alıntılar önemlidir . Aksi halde mvher kelimenin ayrı bir dosya olduğunu düşünürdüm. Örneğin, alıntı yoksa ve adı verilen bir dosya varsa Foo Bar.md, şu şekilde çevrilecektir:

mv Foo Bar.md test - Foo Bar.md

kasıtlı olarak işe yaramaz. Ancak $ftırnak işaretleri ile sarmalayarak , şu anlama gelir:

mv "Foo Bar.md" "test - Foo Bar.md"

Sözdizimine dikkat ederek for, *.mdher birini açıkça adlandırarak tüm dosyaların alt kümesini yeniden adlandırabilirsiniz:

for f in a.md b.md d.md; do mv "$f" "Test - $f"; done

Veya kabuk genişletme kullanarak:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done

Bu tam olarak görmem gereken şeydi. Teşekkürler!
Ryan

11

Eğer varsa prename...

prename 's/^/test - /' *.md

Sıradan kabuk komutlarını kullanarak:

for file in *.md; do
    mv "$file" "test - $file"
done

Nasıl alabilirim prename?
Gaʀʀʏ

Ubuntu 16.04 LTS'de benim için önceden yüklenmiş gibi görünüyor. Paket yöneticinizi denediniz sudo apt-get installmi?
Orion751

5

mmv1 , 2 aynı zamanda böyle bir görev için çok güzel bir araçtır, mevcut işe uygulanırsa

mmv '*.md' 'test - #1.md'

Tabii ki, sadece a.md, b.md ve c.md kodlarına "test -" eklemek istiyorsanız, ancak a1.md yerine

mmv '?.md' 'test - #1.md'

daha uygun olurdu.

Bunu gerçekten önerebilirim, özellikle bu kadar çok sorununuz varsa.

Ek olarak bir grafik arayüzü arıyorsanız, gprename'i deneyin .


5

IFS değişkenini yeniden tanımlamadığınız sürece boşluklarda başarısız olan bir for döngüsü kullanmak yerine, find ile birlikte bir while döngüsü kullanmanızı öneririm. Dosyaları aynı dizinden çalıştırdığınızda aşağıdakiler çalışacaktır

find . -maxdepth 1 -type f -name '*.md' | while read -r file; do
    file=$(basename $file)
    mv "$file" "test - $file"
done

"basename" satırı oradadır, böylece bul sadece dosya adını yazdıracaktır - yeniden adlandırma işlemini kesecek yol bileşenleri olmadan.


2

Gerçekten geç olduğunu biliyorum, ama başka biri böyle bir şey arıyorsa, o zaman bu benim için çalıştı:

rename '' 'name -' *.md

1
basit ve yalındır
user13743

0

Eğer müsaitseniz, zshşunları kullanabilirsiniz zmv:

autoload zmv
zmv -w '*' 'test - $1'

Komutu şu şekilde test edebilirsiniz:

zmv -wn '*' 'test - $1'
  • -n kuru çalışma anlamına gelir, yani sadece ne olacağını gösterir.
  • -w dolaylı olarak parantezi joker karakterlerin etrafına koyar, geri referansların çalışmasını sağlar.

0

Bash, klasördeki tüm dosyalara "Prepend text -" ekliyor:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;

Bu çok uzun bir yazı biçimifor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby
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.