ドットを含まないファイル名にテキストを追加します


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コマンドは、抽出されたファイル名に対してこのmove(or)rename操作を実行します。

\; -> 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コマンドは、ディレクトリの名前も変更します。
Avinash Raj 2014

2

このような場合に私が好むのはmmvです。Ubuntuではデフォルトではインストールされませんが、sudo apt-get install mmvコマンドを使用してインストールできます。

あなたの場合、それを2回使用する必要があります:

  1. .html各ファイル名の最後に追加して、現在のディレクトリからすべてのファイルの名前を変更します。

    mmv -v '*' '#1.html'
    
  2. 以前に1つ以上の名前.(ドット)が付いていたすべてのファイルの名前を再度変更(戻る)します。

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

または、1行で:

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ください
terdon 2014年

それは正しいterdonあなたのコメントに感謝しますが、同じコマンドでこれをどのように解決できますか
nux

3
あなたは本当にできない。lsを解析する安全な方法ほとんどありませんawkand を使用して本当にそれをしたい場合はsh、のようなものを試してくださいprintf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh。それでもファイル名は改行で壊れますが、少なくともスペースは処理できます。これ--は、ファイル名がで始まる場合に必要です-
terdon 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.