Додайте текст до імен файлів, які не містять крапки


9

З огляду на такі файли:

english_api
english_overview
style.css

Я хочу отримати:

english_api.html
english_overview.html
style.css

Іншими словами, як додати текст до всіх файлів, які не містять крапки ( .) в каталозі за допомогою терміналу.

Очевидно, що в цій папці багато файлів; Я просто написав 3 як приклад.

Якби я був, дозволяє сказати, замініть .cssз .htmlв цій папці, я хотів би використовувати:

rename .css .html *.css

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

Відповіді:


13

Спробуйте цю findкоманду,

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

Він перейменовує в цей filename.htmlформат файли, які не містять крапок у своїх іменах, присутніх у поточному каталозі ( додаються .htmlостанніми ).

. -> Представляє поточну каталог

-type f -> Робити цю операцію можна лише на файлах.

! -name "*.*" -> надрукувати назву файлів, у яких немає їх точок.

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

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


6

У bash, ви можете використовувати розширені кулі оболонки, наприклад

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

(видаліть, як echoтільки ви підтвердили, що він відповідає правильному шаблону). Якщо розширений глобус уже не ввімкнено, його можна ввімкнути за допомогою shopt -s extglob.

Інший варіант - використання renameфункції на основі perl з регулярним виразом, який виключає буквальний.

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

(видаліть nопцію, як тільки ви підтвердите, що вона відповідає правильній схемі).


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 ( 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.

ПРИМІТКА :

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


6
Це не вдається для імен файлів, які містять будь-який тип пробілів (пробіли, вкладки, нові рядки тощо). Як правило, ніколи не слід розбиратисяls .
тердон

Це правильний тердон, дякую за ваш коментар, але як я можу вирішити це в тій самій команді
nux

3
Ти насправді не можеш. Існує немає майже ніякої безпечний спосіб для розбору Ls. Якщо ви дійсно хочете зробити це за допомогою awkта sh, спробуйте щось подібне printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Це все ще розбивається на назви файлів з новими рядками, але принаймні це може мати справу з пробілами. Це --потрібно для випадків, коли у вас є імена файлів, починаючи з -.
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.