Cách xóa dấu chấm và dấu cách từ đầu tên tệp


8

Tôi đang cố gắng thay đổi các tệp jpg có tên là dấu chấm và dấu cách ở đầu và dấu chấm bị thiếu trước khi kết thúc (như thế này . StartjpgđểStart.jpg

Dấu chấm làm cho các tệp bị ẩn khỏi sedls -alliệt kê các tệp đó vì vậy tôi chuyển ls -alsang sed. Tôi đã đọc qua nhiều hướng dẫn trực tuyến và tôi luôn gặp lỗi này

sed: -e expression #1, char 6: unknown command: `/'

Tôi đã thử

ls -al | sed -r '/^\./*.*/g'
ls -al | sed -r '/^\.//g'
ls -al | sed -r '/.*/[\.]g'
ls -al | sed 's/^\./\\1*./g'

và nhiều hơn nữa và thậm chí nhiều hơn nữa nhiều hơn nữa.

Ngoài ra tôi cần thay đổi filejpg thành file.jpg


Tôi đã dành 4 giờ cho việc này: / có thể chỉ mất một phút cho bạn
dùng251046

Bạn nói rằng bạn đang cũng cố gắng thay đổi filejpgđể file.jpg. Bạn đang cố gắng làm gì ở nơi đầu tiên?
drs

@drs Tôi đang cố đổi tên . filejpgtập tin thànhfile.jpg
user251046

Có một renamehoặc prenamelệnh (một phần của Perl) là một công cụ tốt hơn nhiều cho công việc này. Lưu ý rằng đôi khi có một công cụ đổi tên không phải là perl rename, nó ít mạnh mẽ hơn nhiều.
derobert

@ user251046, cung cấp cho chúng tôi đầu vào chính xác và đầu ra chính xác. Đồng thời cho chúng tôi biết những gì bạn đang cố gắng làm bằng cách chỉnh sửa câu hỏi của bạn.
Ramesh

Câu trả lời:


9

Với renamecông cụ Perl (được gọi renametrên Debian và bạn bè bao gồm Ubuntu, nó có thể prenameở nơi khác):

rename -n 's/(?<!\.)jpg$/.jpg/' *  # -n makes it show you what it'll do,
                                   # but not actually do it. Remove the -n to
                                   # actually rename

Để phá vỡ patter đó: jpg$có nghĩa là "kết thúc bằng 'jpg'". Các (?<!\.)phương tiện 'không có một dấu chấm trước đó 'jpg'". Đó là ngăn chặn bạn từ việc thay đổi foo.jpgthành foo..jpg, đó sẽ là ngớ ngẩn.

Đây *là ký tự đại diện vỏ bình thường; renamecó một danh sách các tập tin để xem xét đổi tên. Tất nhiên bạn có thể làm /path/to/dir/*, vượt qua một danh sách các tên tệp, sử dụng cùng với find, v.v.

Xóa dấu chấm và dấu cách ngay từ đầu cũng khá dễ dàng:

rename -n 's/^[. ]+//' *          # trying -n first is good practice

Điều đó sẽ loại bỏ tất cả các dấu chấm và khoảng trắng ở đầu. Nó sẽ biến . . . foothành foo.

Thông thường, *mở rộng shell sẽ không mang lại các tệp có tên bắt đầu bằng dấu chấm (tệp ẩn). Một lựa chọn là sử dụng .*; điều đó cũng sẽ mang lại hai mục đặc biệt .(thư mục hiện tại) và ..(thư mục mẹ). Điều đó sẽ vô hại trong trường hợp này; lệnh đầu tiên sẽ bỏ qua chúng (chúng không kết thúc jpg); lệnh thứ hai sẽ cố gắng đổi tên chúng, nhưng điều đó sẽ tạo ra lỗi. Một cách khác là tìm:

find -type f -exec rename -n 's/^[. ]+//' '{}' +

-type fsẽ giới hạn chỉ các tập tin. Tất nhiên bạn cũng có thể sử dụng bất kỳ tùy chọn nào khác.


Các -ntùy chọn không thực hiện danh sách bất cứ điều gì và không có nó chẳng may không đổi tên anything.I đoán đó là bởi vì các tập tin được ẩn với nó.
dùng251046

@ user251046 hãy thử .*thay vì *. Điều đó sẽ kết thúc thông qua các mục đặc biệt ...cũng vậy, nhưng nó sẽ bỏ qua những mục đó.
derobert

Làm thế nào bạn học được tất cả điều này? Bạn thật tuyệt vời! Có lẽ bạn có thể chỉ cho tôi nơi bạn tìm thấy điều này? Ngoài ra bây giờ tôi có một tệp có tên là IMG_32347 làm thế nào để thêm .jpg vào nó?
dùng251046

@ user251046 nếu một tệp của nó, cho đến nay cách dễ nhất là mv IMG_32347 IMG_32347.jpg. Tôi đã học được tất cả những điều này từ việc sử dụng Linux trong hơn 15 năm nay và Perl thậm chí còn lâu hơn nữa.
derobert

Cảm ơn bạn đã trả lời của bạn, tôi biết tôi chỉ có thể làm mv nhưng tôi đang hỏi bởi vì điều này rất hữu ích để biết. Đây là những gì tôi vừa thử (và thất bại)rename -n 's/(?<!\.flac)/.flac\$/' *
user251046 23/07/14

4

Mặc dù sedlà một công cụ rất hữu ích và linh hoạt, nhưng bạn không sử dụng nó đúng cách. Nó được sử dụng tốt nhất để khớp và thay thế các chuỗi trong tệp văn bản; nó không thể đổi tên trực tiếp các tập tin trên hệ thống tập tin.

Nhiệm vụ này phù hợp hơn với bash one-liner (giả sử đó là vỏ của bạn). Để đổi tên một cái gì đó như . filejpgđể file.jpg, sử dụng này:

find . -name '. *' -print0 | while read -d $'\0' file; do short_file=${file%jpg}.jpg; mv "$file" "${short_file:4}"; done

Giải trình

findlà một chương trình trả về các đường dẫn đến các tệp khớp với một thuộc tính tệp nhất định, trong trường hợp này là tên của tệp. Nếu tất cả những gì bạn muốn biết là những tập tin .jpg nào trong thư mục con của đường dẫn hiện tại của bạn, bạn sẽ làm find . -name "*.jpg". Thông thường, điều này xuất ra mỗi tệp trên một dòng mới. Thay vào -print0đó, làm cho nó tách các trận đấu bằng một ký tự null. Điều này cho phép xử lý đúng tên tệp có khoảng trắng khi chúng ta chuyển đầu ra cho các lệnh tiếp theo.

Các |nhân vật được gọi là một đường ống. Nó báo cho shell lấy đầu ra của lệnh bên trái và chuyển nó làm đầu vào cho lệnh bên phải, trong trường hợp này là readlệnh trong whilevòng lặp.

Các readlệnh được sử dụng để lấy đầu ra của findvà gán nó vào một biến, file. Thông thường, điều này sẽ gán giá trị cho filemỗi từ tại một thời điểm, nhưng -d $'\0'$nguyên nhân khiến các bài tập được phân định bằng ký tự null (khớp với cách chúng tôi phân định các tệp findbằng cách sử dụng -print0cờ).

Các vòng lặp while gây ra readviệc lặp lại các giá trị cho "tệp" cho mỗi tên tệp phù hợp. Các dodonelà một phần của cú pháp bash tiêu chuẩn cho một vòng lặp while:

while <something is true>; do
    <run some commands>
done

Trong trường hợp này, trước tiên "chạy một số lệnh" của chúng tôi sẽ sửa phần mở rộng của tên tệp và gán nó cho một biến mới: short_file=${file%jpg}.jpgthay đổi . filejpgthành . file.jpg. Sau đó, nó chạy mvđể đổi tên tập tin, loại bỏ .phần đầu của tên tệp được sửa chữa mở rộng : mv "$file" ${short_file:2}.


Đổi tên thế nào rồi?
dùng251046

Bạn có thể giải thích làm thế nào "cái một lót" này hoạt động?
dùng251046

bỏ phiếu yêu cầu 15 danh tiếng
user251046 23/07/14

Cảm ơn bạn đã giải thích cặn kẽ. Tôi không hiểu phần này mặc dù *Normally this would assign values to file each word at a time, but the -d $'\0'$ causes the assignments to be delimited by the null character (matching how we delimited the files in find by using the -print0 flag).*nó hoạt động, làm thế nào để chọn phần này làm câu trả lời được chấp nhận của tôi ?
dùng251046

bạn chỉ có thể chọn một câu trả lời cho mỗi câu hỏi. Câu trả lời của derobert là sạch hơn một chút vì vậy có lẽ tốt hơn là để nó như là một lựa chọn.
drs

0

Thay thế cho các câu trả lời khác, bạn có thể sử dụng GPRename của công cụ đồ họa . Nó có thể thay thế các ký tự, cắt bớt tên tệp, v.v ... Ưu điểm là có chức năng xem trước tích hợp để kiểm tra tên tệp mới trước khi đổi tên chúng. Nhưng vì nó hoạt động trên một thư mục tại một thời điểm, nên sẽ bất tiện khi sử dụng nó với nhiều thư mục trong các thư mục phụ. Nhưng với ít hơn 10 thư mục thì đó không phải là vấn đề.

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.