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

9

Даны следующие файлы:

english_api
english_overview
style.css

Я хочу получить:

english_api.html
english_overview.html
style.css

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

Очевидно, что в этой папке много файлов; Я просто написал 3 в качестве примера.

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

rename .css .html *.css

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

Bor691
источник

Ответы:

13

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

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

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

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

-type f -> Для выполнения этой операции только над файлами.

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

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

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

Авинаш Радж
источник
6

В bash вы можете использовать расширенные оболочки, например:

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

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

Другой вариант - использование функции на основе Perl renameс регулярным выражением, исключающим литерал.

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

(удалите nопцию, как только вы подтвердите, что она соответствует правильному шаблону).

steeldriver
источник
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneКоманда также переименовывает каталоги.
Авинаш Радж
2

Мои предпочтения в таких случаях есть 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для получения дополнительной информации.

Раду Рэдяну
источник
1

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

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
Жиль "ТАК - прекрати быть злым"
источник
-2

Ответы идеальны, я также даю вам еще одну команду, которая делает эту работу:

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.

НОТА :

Я пытаюсь ваш сценарий и команда сделать работу.

Nux
источник
6
Это не работает с именами файлов, которые содержат любые типы пробелов (пробелы, табуляции, новые строки и т. Д.). Как правило, вы никогда не должны анализироватьls .
тердон
Это верно, Тердон, спасибо за ваш комментарий, но как я могу решить эту проблему в той же команде
NUX
3
Вы не можете на самом деле. Существует нет почти никакой безопасный способ для разбора Ls. Если вы действительно хотите сделать это с помощью awkи sh, попробуйте что-то вроде printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Это по-прежнему будет нарушать имена файлов с помощью новых строк, но, по крайней мере, оно может иметь дело с пробелами --Необходим в тех случаях , когда у вас есть имена файлов , начинающиеся с -.
тердон