Hapus baris baru dalam nama file

9

Saya memiliki kode PHP yang menghasilkan nama file di mana wget akan menambahkan log-nya. Saya menghasilkan 2000+ file, tetapi masalahnya adalah saya kesulitan bekerja dengannya karena saya memiliki kesalahan menempatkan PHP_EOLsebagai bagian dari namanya, kode itu akan ditambahkan LF/line feed/%0Apada namanya

Contoh nama file tersebut (ketika diakses melalui browser, ketika memakai / var / www / html) http://xxxx/wget_01_a%0a.txtperhatikan %0asebelum nama ekstensi

Saya mengacaukan, dan saya berharap ada batch rename yang akan mencari semua file dan jika ditemukan line feedmaka akan mengganti nama file tersebut tanpa feed baris sehingga hanya akan menjadihttp://xxxx/wget_01_a.txt

Saya tidak begitu yakin bagaimana menangani ini karena sepertinya ketika saya lsmenggunakan semua karakter khusus yang tidak terbatas pada karakter yang tidak diinginkan ?, apa yang ingin saya targetkan adalah umpan baris itu.

arvil
sumber

Jawaban:

11

Menggunakan utilitas renamedari util-linux, yang disediakan oleh CentOS 6, dan dengan asumsi bash:

rename $'\n' '' wget_*

Ini meminta untuk menghapus karakter baris baru dari nama file yang terdaftar. Saya sarankan mencobanya pada subset kecil untuk memastikannya melakukan apa yang Anda inginkan (perhatikan bahwa renamepada CentOS 7 mendukung sebuah -vsaklar untuk menunjukkan kepada Anda perubahan yang dibuatnya).

Jika Anda menggunakan distribusi yang menyediakan berbasis Perl rename:

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

Dan kemudian jalankan tanpa -nbenar-benar melakukan penggantian nama.

Dhag
sumber
bro, tidak ada yang terjadi pastebin.com/NjMg8vTL Saya menggunakan centos 6
arvil
Mungkin karakter linefeed yang Anda miliki sebenarnya tidak \n? Bisakah Anda melakukan sesuatu seperti gema *.txt | od -csehingga kami melihat karakter apa yang sebenarnya tidak dapat dicetak?
Dhag
sepertinya \n pastebin.com/wXCDCJjr
arvil
Saya tidak yakin apa yang salah, kecuali karena suatu alasan file di paste sebelumnya tidak cocok *.txt(yang akan menjelaskan mengapa renametidak mengambilnya). Jika Anda mengatur kedua pola menjadi, katakanlah, txtalih-alih $'\n'dan '', apakah Anda mendapatkan output? Apakah echo $ '\ n' memang mencetak dua baris baru?
Dhag
1
Saya harus menggunakannya rename $'\r' '' wget_*untuk bekerja
rshdev
2

Berdasarkan apa yang sudah dijawab, saya telah menggeneralisasi untuk mengganti nama semua file yang berisi umpan baris dalam folder dan sub-folder saat ini, dengan menggabungkan perintah find dengan rename -

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

Di sini, perintah find menempatkan semua file yang berisi umpan baris dan mengganti nama perintah menggantikan setiap umpan baris dalam nama dengan spasi.

Hal yang sama dapat dilakukan untuk karakter bermasalah lainnya seperti carriage return (\ r).

Prasad Bhat
sumber