AIX 6.1 menyalin file dengan karakter non-standar dalam nama file [ditutup]

2

Saya memiliki masalah besar dengan beberapa karakter non-standar saat mencoba menyalin (demi cadangan) beberapa file dalam AIX 6.1. Yang perlu saya lakukan adalah memiliki arsip cadangan dengan nama file yang persis sama untuk dapat mengembalikan file dan membuatnya semuanya berfungsi lagi.

Saya mencoba membuat skrip ksh yang akan mengambil nama demi nama (baris demi baris) dari file csv dan menyalinnya menggunakan cp ke tujuan cadangan. Setelah menjalankan skrip, saya menyadari ada beberapa file yang hilang di lokasi baru. Setelah beberapa penyelidikan saya melihat bahwa file yang hilang memiliki beberapa karakter non-standar dalam nama mereka di direktori asli (seperti panjang -, huruf dengan aksen dll).

  1. Saya memiliki file csv dengan daftar file yang akan disalin, berikut contohnya dengan panjang "-":
    cat file_list.csv | grep pattern /path/to/file/some–file_with_pattern

  2. ketika saya mencoba menyalin file spesifik ini dengan cp (baik dengan skrip atau secara manual menjalankan cp):
    cp /path/to/file/some–file_with_pattern /new/backup/path cp: /path/to/file/some–file_with_pattern: No such file or directory

  3. ketika saya menampilkan file dengan ls:
    ls /path/to/file | grep pattern some?file_with_pattern

Jadi AIX melihat file dengan "?" bukannya "-" maka cp melempar kesalahan. Ketika saya menggunakan wildcard (* atau?) Untuk menyalin file, maka itu disalin tetapi memiliki "?" alih-alih "-" di direktori tujuan. Ketika saya memasukkan nama file di '' atau "" itu sama, "?" alih-alih "-" di direktori tujuan. Ini tidak memenuhi kebutuhan saya, karena ketika saya mengembalikan file dengan nama yang berbeda ("?" Bukan "-"), aplikasi yang menggunakannya tidak akan dapat merujuknya.

Saya mencoba keduanya ksh dan sh (bash tidak tersedia di server). Saya mencoba bermain dengan lokal (memaksa UTF8 dengan mengatur LC_ALL = "en_US.UTF-8"). Saya mencoba bermain dengan pengaturan penyandian Putty. Namun saya masih tidak dapat merujuk ke file dengan nama aslinya, karenanya tidak dapat menyalinnya dengan menyimpan nama asli. Adakah yang tahu cara menyalin file-file itu menggunakan perintah shell?

Luke
sumber
2
Bagaimana cara kerjanya jika Anda meletakkan cp "your / path / pattern"
Kiwy
Wow. Itu yang sulit. POSIX tidak dapat membantu Anda di sini. Beberapa googling menemukan halaman ini , yang menyarankan penggunaan lokal EN_US (bukan en_US) untuk memaksa UTF8.
Nick ODell
1
Bisakah Anda menunjukkan bagaimana Anda membaca file CSV untuk menghasilkan cpperintah?
Jeff Schaller
apakah ini cp -rp /path/to /new/backup/pathbekerja untuk anda?
Jeff Schaller

Jawaban:

1

Ada tiga masalah berbeda untuk diatasi di sini:

A ?inls

Tidak benar bahwa lsakan menampilkan karakter asli dalam nama file.

Misalnya, nama file berikut berisi karakter yang lsmungkin mengganti (tidak selalu) dengan ?:

$ eval "$(printf "a='\n' b=\032 c=–")"
$ touch test{"$a","$b","$c"}file
$ ls --quoting-style=literal test*
test?file  test?file  test–file

Tapi ini tidak akan digunakan ?(ini adalah shell yang mencantumkan file):

$ echo test*
test
file testfile test–file

Tentu saja, untuk menunjukkan karakter (dikodekan) lakukan:

$ echo test* | od -An -tc
   t   e   s   t  \n   f   i   l   e       t   e   s   t 032   f   i   l   e
   t   e   s   t 342 200 223   f   i   l   e  \n

Jadi, Anda perlu menggunakan sesuatu seperti oduntuk benar-benar melihat karakter yang digunakan dalam file.

$ touch 'some–file_with_pattern'
$ echo *pattern* | od -An -tc
   s   o   m   e 342 200 223   f   i   l   e   _   w   i   t   h   _   p   a   t   t   e   r   n  \n

penyandian

Perhatikan bahwa dasbor panjang di atas selalu ditampilkan dengan benar sebagai karakter yang terlihat: (berlawanan dengan ?dalam contoh Anda) karena pengkodean diatur dengan benar ke utf-8.

Jadi periksa pengaturan Putty Anda di bawah Terjemahan dan pastikan bahwa Anda telah menetapkan UTF-8 sebagai set karakter.

Dan kemudian coba baris ini, itu harus mencetak karakter yang sama yang Anda lihat di halaman web ini.

$ echo 'áé€íìïîößđ₣λŕžç×  Москва  Ελληνικά'
áé€íìïîößđ₣λŕžç×  Москва  Ελληνικά

pengkodean sistem file

Kedua masalah di atas harus menyelesaikan masalah dalam 99% kasus kecuali dalam kasus-kasus di mana pengkodean sistem file tidak cocok dengan pengkodean lokal atau berbeda antara dua sistem file yang terlibat.

Pastikan tidak ada masalah dengan dua masalah di atas bahkan sebelum melihat ke masalah ini. Baca file yang sama, nama file yang berbeda karena masalah pengkodean?

Ishak
sumber