Xóa dòng mới trong tên tệp


9

Tôi có một mã PHP tạo tên tệp mà wget sẽ nối các nhật ký của nó. Tôi đã tạo hơn 2000 tệp, nhưng vấn đề là tôi gặp sự cố khi làm việc với chúng vì tôi đã nhầm lẫn khi đặt PHP_EOLmột phần tên của nó, mã đó sẽ thêm LF/line feed/%0Avào tên của nó

Ví dụ về tên tệp như vậy (khi được truy cập qua trình duyệt, khi đặt / var / www / html), hãy http://xxxx/wget_01_a%0a.txtchú ý đến %0atên mở rộng

Tôi đã nhắn tin và tôi ước có một đợt đổi tên sẽ tìm kiếm trong tất cả các tệp và nếu tìm thấy line feednó sẽ đổi tên nó mà không cần nguồn cấp dữ liệu để nó chỉ làhttp://xxxx/wget_01_a.txt

Tôi không chắc chắn làm thế nào để xử lý việc này bởi vì dường như khi tôi lsđặt putty, tất cả các ký tự đặc biệt không bị giới hạn bởi char không mong muốn đó trở thành ?, điều tôi chỉ muốn nhắm đến là nguồn cấp dữ liệu đó.

Câu trả lời:


11

Sử dụng tiện ích renametừ linux-linux, mà CentOS 6 cung cấp và giả sử bash:

rename $'\n' '' wget_*

Điều này yêu cầu xóa các ký tự dòng mới khỏi tên của các tệp được liệt kê. Tôi khuyên bạn nên dùng thử trên một tập hợp con nhỏ để đảm bảo nó thực hiện những gì bạn muốn (lưu ý rằng renametrên CentOS 7 hỗ trợ một -vcông tắc để cho bạn biết những thay đổi mà nó đang thực hiện).

Nếu thay vào đó, bạn đã ở trên một bản phân phối cung cấp dựa trên Perl rename:

rename -n 's/\n//g' wget_*

Và sau đó chạy mà không -nthực sự đổi tên.


bro, không có gì xảy ra pastebin.com/NjMg8vTL Tôi đang sử dụng centos 6
arvil

Có lẽ nhân vật linefeed bạn không thực sự \n? Bạn có thể làm một cái gì đó như tiếng vang *.txt | od -cđể chúng tôi thấy nhân vật không thể in thực tế ở đó không?
dhag

có vẻ như \n pastebin.com/wXCDCJjr
arvil

Tôi không chắc chắn điều gì sai, trừ khi vì một số lý do, tệp trong lần dán trước của bạn không khớp *.txt(điều này sẽ giải thích tại sao renamekhông chọn nó). Nếu bạn đặt hai mẫu thành, txtthay vì $'\n''', bạn có nhận được đầu ra nào không? Có phải echo $ '\ n' thực sự in hai dòng mới?
dhag

1
Tôi đã phải sử dụng rename $'\r' '' wget_*nó để làm việc
rshdev

2

Dựa trên những gì đã được trả lời, tôi đã khái quát nó để đổi tên tất cả các tệp chứa nguồn cấp dữ liệu trong thư mục hiện tại và thư mục con, bằng cách kết hợp lệnh find với đổi tên -

find -name $'*\n*' -exec rename  $'s|\n| |g' '{}' \;

Tại đây, lệnh find định vị tất cả các tệp chứa nguồn cấp dữ liệu và đổi tên lệnh thay thế mọi nguồn cấp dữ liệu trong tên bằng một khoảng trắng.

Điều tương tự có thể được thực hiện đối với bất kỳ nhân vật có vấn đề nào khác, chẳng hạn như trả lại xe ngựa (\ r).

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.