Jak masowo dodawać tekst do nazw plików?

44

Powiedzmy, że mam katalog pełen .mdplików o różnych nazwach. Powiedzmy, że chciałem wstawić „tekst” na początku każdej nazwy pliku. Tak na przykład: plik a.md, b.mdi c.mdstałoby się test - a.md, test - b.mdoraz test - c.md.

Jak mam to zrobić za pomocą wiersza poleceń?

Jesse Atkinson
źródło

Odpowiedzi:

60

Jednowarstwowy, który można łatwo pisać bezpośrednio z terminala:

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

Lub przepisane w osobnych wierszach zamiast średników:

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

Ekspozycja

Składnia for(w sh):

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

Tutaj nasi NAMEis fa nasze WORDSwszystkie są pliki w bieżącym katalogu dopasowywania *.md. Tak więc zmienna $fzostanie podstawiona każdym dopasowaniem pliku *.md.

Więc dla a.md:

mv "$f" "test - $f"

staje się

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

Cytaty są ważne, ponieważ każda nazwa pliku $fmoże zawierać spacje. W przeciwnym razie mvkażde słowo byłoby osobnym plikiem. Na przykład, jeśli nie było cudzysłowów, a istnieje plik o nazwie Foo Bar.md, oznaczałoby to:

mv Foo Bar.md test - Foo Bar.md

co nie działałoby tak, jak zamierzono. Ale zawijanie $fw cudzysłów ma sens:

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

Biorąc pod uwagę składnię for, możesz również zmienić nazwę podzestawu wszystkich *.mdplików, nadając im jawne nazwy:

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

Lub używając rozszerzenia powłoki:

for f in {a,b,d}.md; do mv "$f" "Test - $f"; done
QuasarDonkey
źródło
Właśnie to musiałem zobaczyć. Dzięki!
Ryan
11

Jeśli masz prename...

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

Używanie zwykłych poleceń powłoki:

for file in *.md; do
    mv "$file" "test - $file"
done
grawitacja
źródło
Jak mogę dostać prename?
Gaʀʀʏ
Wydaje się być preinstalowany dla mnie na Ubuntu 16.04 LTS. Czy próbowałeś już swojego menedżera pakietów (tj., sudo apt-get install)?
Orion751
5

mmv1 , 2 to także bardzo miłe narzędzie do takiego zadania, byłoby zastosowane do bieżącej pracy

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

Oczywiście, jeśli chcesz dodać „test -” do a.md, b.md i c.md, ale nie do a1.md, coś w rodzaju

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

byłoby bardziej odpowiednie.

Naprawdę mogę to zasugerować, zwłaszcza jeśli masz wiele takich problemów.

Jeśli dodatkowo szukasz interfejsu graficznego, wypróbuj gprename .

Klaudiusz
źródło
5

Zamiast używać pętli for, która zawiedzie spacje, chyba że przedefiniujesz zmienną IFS, zaleciłbym użycie pętli while w połączeniu z find. Poniższe będą działać po uruchomieniu z tego samego katalogu co pliki

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

znajduje się tam wiersz „basename”, więc find wypisze tylko nazwę pliku - bez składników ścieżki, które spowodowałyby przerwanie operacji zmiany nazwy.

Fred Clausen
źródło
2

Wiem, że jest naprawdę późno, ale jeśli ktoś szuka czegoś takiego, to zadziałało dla mnie:

rename '' 'name -' *.md
nullptr
źródło
1
prosty i bezpośredni
user13743
0

Jeśli masz zshdostępne, możesz użyć zmv:

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

Możesz przetestować polecenie za pomocą:

zmv -wn '*' 'test - $1'
  • -n oznacza suchobieg, tzn. pokaż tylko, co się stanie.
  • -w pośrednio umieszcza nawiasy wokół symboli wieloznacznych, sprawia, że ​​odwołania wsteczne działają.
Thor
źródło
0

W trybie bash dodawanie „Przygotuj tekst -” do wszystkich plików w folderze:

for i in *; do mv "$i" "$(echo $i | sed 's/^/Prepend\ text\ \-\ /')"; done;
Ozyrys
źródło
To bardzo długa droga pisaniafor i in *; do mv "$i$" "Prepend text - $i"; done
David Richerby