Учитывая следующие файлы:
english_api
english_overview
style.css
Я хочу добраться:
english_api.html
english_overview.html
style.css
Другими словами, как добавить текст во все файлы, которые Не Содержат точку (.
) в рамках каталога с помощью терминала.
Очевидно, существует много файлов в той папке; я просто записал 3 как пример.
Если я был к, позволяет, говорят, замена .css
с .html
в той папке я использовал бы:
rename .css .html *.css
Но я не могу действительно думать о способе соответствовать файлам, которые не содержат что-то. Также, как добавить (по сравнению с заменой) использование rename
команда?
Попробуйте это find
команда,
find . -type f ! -name "*.*" -exec mv {} {}.html \;
Это переименовывает файлы, который не содержит точки в их именах файлов, существующих в текущем каталоге к этому filename.html
формат (добавленный .html
в последнем).
.
-> Представляет текущий каталог
-type f
->, Чтобы сделать эту операцию только на файлах.
! -name "*.*"
-> печатают название файлов, которое не имеет точек на их имя.
-exec mv {} {}.html
--> find
команда выполняет это перемещение (или) переименовывает операцию на извлеченных именах файлов.
\;
-> Представляет конец find
команда.
Мой предпочтенный в случаях как это mmv
. Это не установлено по умолчанию в Ubuntu, но можно установить использование sudo apt-get install mmv
команда.
В Вашем случае необходимо использовать его два раза:
Переименовывают все файлы из текущего каталога путем добавления .html
в конце каждого имени файла:
mmv -v '*' '#1.html'
Переименовывают снова (назад) все файлы, которые имели ранее на их имена один или несколько .
(точки):
mmv -v '*.*.html' '#1.#2'
Или, в одной строке:
mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'
-v
опция не обязательна. Я использую его только для подробного вывода, потому что без него mmv
выполняет действия тихо.
См. man mmv
для большего количества информации
В ударе Вы могли использовать расширенные шарики оболочки, например.
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
опция, после того как Вы подтвердили это, соответствует корректному шаблону).
С Perl переименовывают команду (prename
), можно добавить условие, что имя файла должно содержать точку. Если отрывок Perl не меняет имя файла, тот файл оставляют нетронутым. Вот несколько способов записать это:
prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
Ответы прекрасны, я также даю Вам другую команду, которые делают это задание:
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.
ПРИМЕЧАНИЕ:
Я пробую Ваш сценарий, и команда делают задание.