Dołącz tekst do nazw plików, które nie zawierają kropki

9

Biorąc pod uwagę następujące pliki:

english_api
english_overview
style.css

Chcę dostać:

english_api.html
english_overview.html
style.css

Innymi słowy, jak dołączyć tekst do wszystkich plików, które nie zawierają kropki ( .) w katalogu przy użyciu terminala.

Oczywiście w tym folderze jest dużo plików; Właśnie napisałem 3 jako przykład.

Gdybym miał, powiedzmy, wymienić .csssię .htmlw tym folderze, chciałbym używać:

rename .css .html *.css

Ale tak naprawdę nie mogę wymyślić sposobu dopasowania plików, które nie zawierają czegoś. Również jak dołączyć (vs zamienić) za pomocą renamepolecenia?

Bor691
źródło

Odpowiedzi:

13

Wypróbuj to findpolecenie,

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

Zmienia nazwy plików, które nie zawierają kropek w nazwach plików obecnych w bieżącym katalogu, na ten filename.htmlformat ( dodany .htmlna końcu ).

. -> Reprezentuje bieżący katalog

-type f -> Aby wykonać tę operację tylko na plikach.

! -name "*.*" -> wydrukuj nazwy plików, które nie mają kropek w nazwie.

-exec mv {} {}.html -> findpolecenie wykonaj tę operację przeniesienia (lub) zmiany nazwy wyodrębnionych nazw plików.

\; -> Reprezentuje koniec findpolecenia.

Avinash Raj
źródło
6

W bashu możesz użyć rozszerzonych globów powłoki, np

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

(usuń echopo potwierdzeniu, że pasuje do prawidłowego wzoru). Jeśli rozszerzone globowanie nie jest jeszcze włączone, możesz je włączyć za pomocą shopt -s extglob.

Inną opcją jest użycie renamefunkcji opartej na perlu z wyrażeniem regularnym, które wyklucza literał.

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

(usuń nopcję po potwierdzeniu, że pasuje do prawidłowego wzoru).

steeldriver
źródło
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; donepolecenie zmienia także nazwy katalogów.
Avinash Raj
2

Preferuję w takich przypadkach mmv. Nie jest instalowany domyślnie w Ubuntu, ale można zainstalować za pomocą sudo apt-get install mmvpolecenia.

W twoim przypadku musisz go użyć dwa razy:

  1. Zmień nazwę wszystkich plików z bieżącego katalogu, dodając .htmlna końcu każdej nazwy pliku:

    mmv -v '*' '#1.html'
    
  2. Zmień nazwę ponownie (wstecz) na wszystkie pliki, które wcześniej miały w swoich nazwach jeden lub więcej .(kropki):

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

Lub w jednym wierszu:

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

-vopcja nie jest obowiązkowa. Używam go tylko do pełnego wyjścia, ponieważ bez niego mmvwykonuje działania w ciszy.

Zobacz man mmvwięcej informacji.

Radu Rădeanu
źródło
1

Za pomocą polecenia Perl rename ( prename) możesz dodać warunek, że nazwa pliku musi zawierać kropkę. Jeśli fragment Perla nie zmienia nazwy pliku, plik ten pozostaje nietknięty. Oto kilka sposobów na napisanie tego:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
Gilles „SO- przestań być zły”
źródło
-2

Odpowiedzi są idealne, podaję też inne polecenie, które wykonują tę pracę:

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

Niektóre wyjaśnienia:

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.

UWAGA :

Wypróbowuję twój scenariusz i polecenie wykonuje zadanie.

nux
źródło
6
Nie działa to w przypadku nazw plików zawierających dowolny rodzaj białych znaków (spacje, tabulatory, znaki nowej linii itp.). Zasadniczo nigdy nie należy parsowaćls .
terdon
To prawda, dziękuję za komentarz, ale jak mogę to rozwiązać za pomocą tego samego polecenia
nux
3
Naprawdę nie możesz. Nie ma prawie żadnego bezpieczny sposób do analizowania ls. Jeśli naprawdę chcesz to zrobić za pomocą awki sh, spróbuj czegoś takiego printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Nadal będzie to łamać nazwy plików z nowymi liniami, ale przynajmniej może radzić sobie ze spacjami. --Jest potrzebne w przypadkach, gdy masz nazwy plików rozpoczynające się -.
terdon