Nối văn bản vào tên tệp không chứa dấu chấm


9

Cho các tệp sau:

english_api
english_overview
style.css

Tôi muốn lấy:

english_api.html
english_overview.html
style.css

Nói cách khác, làm thế nào để nối một văn bản vào tất cả các tệp không chứa dấu chấm ( .) trong thư mục bằng terminal.

Rõ ràng có rất nhiều tập tin trong thư mục đó; Tôi chỉ viết 3 làm ví dụ.

Nếu tôi đã, giả sử, thay thế .cssbằng .htmltrong thư mục đó, tôi sẽ sử dụng:

rename .css .html *.css

Nhưng tôi thực sự không thể nghĩ ra cách nào khớp các tập tin không chứa thứ gì đó. Ngoài ra làm thế nào để chắp thêm (so với thay thế) bằng cách sử dụng renamelệnh?

Câu trả lời:


13

Hãy thử findlệnh này ,

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

Nó đổi tên các tệp không chứa dấu chấm trong tên tệp của chúng có trong thư mục hiện tại sang filename.htmlđịnh dạng này ( được thêm .htmlvào cuối cùng ).

. -> Đại diện cho thư mục hiện tại

-type f -> Để thực hiện thao tác này chỉ trên các tệp.

! -name "*.*" -> in tên của các tệp không có dấu chấm trong tên của chúng.

-exec mv {} {}.html -> findlệnh thực hiện di chuyển này (hoặc) đổi tên thao tác trên tên tệp được trích xuất.

\; -> Thể hiện sự kết thúc của findlệnh.


6

Trong bash, bạn có thể sử dụng các khối vỏ mở rộng, vd

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

(loại bỏ echomột khi bạn đã xác nhận nó phù hợp với mẫu chính xác). Nếu tính năng mở rộng toàn cầu chưa được kích hoạt, bạn có thể kích hoạt nó với shopt -s extglob.

Một tùy chọn khác là sử dụng renamehàm dựa trên perl với biểu thức chính quy không bao gồm nghĩa đen.

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

(loại bỏ ntùy chọn một khi bạn đã xác nhận nó phù hợp với mẫu chính xác).


for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; donelệnh cũng đổi tên các thư mục.
Avinash Raj

2

Tôi thích trong trường hợp như thế này mmv. Nó không được cài đặt theo mặc định trong Ubuntu, nhưng bạn có thể cài đặt bằng sudo apt-get install mmvlệnh.

Trong trường hợp của bạn, bạn cần sử dụng nó hai lần:

  1. Đổi tên tất cả các tệp từ thư mục hiện tại bằng cách thêm .htmlvào cuối mỗi tên tệp:

    mmv -v '*' '#1.html'
    
  2. Đổi tên lại (trở lại) tất cả các tệp trước đây có tên một hoặc nhiều .(dấu chấm):

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

Hoặc, trong một dòng:

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

-vtùy chọn không bắt buộc. Tôi chỉ sử dụng nó cho một đầu ra dài dòng vì không có nó mmvthực hiện các hành động một cách im lặng.

Xem man mmvđể biết thêm.


1

Với lệnh đổi tên Perl ( prename), bạn có thể thêm một điều kiện là tên tệp phải chứa dấu chấm. Nếu đoạn mã Perl không thay đổi tên của tệp, tệp đó sẽ không bị ảnh hưởng. Dưới đây là một vài cách để viết này:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *

-2

Các câu trả lời là hoàn hảo, tôi cũng cung cấp cho bạn một lệnh khác thực hiện công việc này:

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

Một số giải thích:

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.

GHI CHÚ :

Tôi thử kịch bản của bạn và lệnh làm cho công việc.


6
Điều này không thành công trên tên tệp có chứa bất kỳ loại khoảng trắng (khoảng trắng, tab, dòng mới, v.v.). Theo nguyên tắc chung, bạn không bao giờ nên phân tích cú phápls .
terdon

Đúng vậy, cảm ơn vì nhận xét của bạn, nhưng làm thế nào tôi có thể giải quyết vấn đề này trong cùng một lệnh
nux

3
Bạn thực sự không thể. Hầu như không có cách nào an toàn để phân tích ls. Nếu bạn thực sự muốn làm điều đó bằng cách sử dụng awksh, hãy thử một cái gì đó như printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Điều đó vẫn sẽ phá vỡ tên tệp với dòng mới nhưng ít nhất nó có thể xử lý khoảng trắng. Điều --này là cần thiết cho các trường hợp bạn có tên tệp bắt đầu bằng -.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.