Добавьте текст к именам файлов, которые не содержат точку

Учитывая следующие файлы:

english_api
english_overview
style.css

Я хочу добраться:

english_api.html
english_overview.html
style.css

Другими словами, как добавить текст во все файлы, которые Не Содержат точку (.) в рамках каталога с помощью терминала.

Очевидно, существует много файлов в той папке; я просто записал 3 как пример.

Если я был к, позволяет, говорят, замена .css с .html в той папке я использовал бы:

rename .css .html *.css

Но я не могу действительно думать о способе соответствовать файлам, которые не содержат что-то. Также, как добавить (по сравнению с заменой) использование rename команда?

9
задан 16 June 2014 в 23:00

5 ответов

Попробуйте это find команда,

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

Это переименовывает файлы, который не содержит точки в их именах файлов, существующих в текущем каталоге к этому filename.htmlформат (добавленный .html в последнем).

. -> Представляет текущий каталог

-type f ->, Чтобы сделать эту операцию только на файлах.

! -name "*.*" -> печатают название файлов, которое не имеет точек на их имя.

-exec mv {} {}.html --> find команда выполняет это перемещение (или) переименовывает операцию на извлеченных именах файлов.

\; -> Представляет конец find команда.

13
ответ дан 23 November 2019 в 04:49

Мой предпочтенный в случаях как это mmv. Это не установлено по умолчанию в Ubuntu, но можно установить использование sudo apt-get install mmv команда.

В Вашем случае необходимо использовать его два раза:

  1. Переименовывают все файлы из текущего каталога путем добавления .html в конце каждого имени файла:

    mmv -v '*' '#1.html'
    
  2. Переименовывают снова (назад) все файлы, которые имели ранее на их имена один или несколько . (точки):

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

Или, в одной строке:

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

-v опция не обязательна. Я использую его только для подробного вывода, потому что без него mmv выполняет действия тихо.

См. man mmv для большего количества информации

2
ответ дан 23 November 2019 в 04:49

В ударе Вы могли использовать расширенные шарики оболочки, например.

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

(удалите echo после того как Вы подтвердили, что это соответствует корректному шаблону). Если расширено globbing уже не включен, можно включить его с shopt -s extglob.

Другая опция использует находящееся в perl rename функция с regex, который исключает литерал .

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

(удалите n опция, после того как Вы подтвердили это, соответствует корректному шаблону).

6
ответ дан 23 November 2019 в 04:49

С Perl переименовывают команду (prename), можно добавить условие, что имя файла должно содержать точку. Если отрывок Perl не меняет имя файла, тот файл оставляют нетронутым. Вот несколько способов записать это:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
1
ответ дан 23 November 2019 в 04:49

Ответы прекрасны, я также даю Вам другую команду, которые делают это задание:

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

Некоторое объяснение:

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.

ПРИМЕЧАНИЕ:

Я пробую Ваш сценарий, и команда делают задание.

-2
ответ дан 23 November 2019 в 04:49

Другие вопросы по тегам:

Похожие вопросы: