Linux menyalin ke filesystem fat32: argumen tidak valid

12

Ketika saya menyalin file dari partisi ext3 ke FAT32 menggunakan cp:

cp -R /ext3/stuff /fat32/partition/

Saya mendapatkan pesan argumen yang tidak valid untuk semua file dengan titik dua dan tanda tanya di.

Apakah ada cara untuk mendapatkan cp untuk menghapus karakter yang tidak valid untuk sistem file target?

sunting: Saya sudah memeriksa opsi cp lagi, dan kecuali saya bodoh, tidak ada apa-apa di sana. Saya yakin saya bisa menulis skrip, tapi rasanya harus ada solusi yang lebih bersih!

mo-seph
sumber

Jawaban:

10

Tersangka yang biasa ketika Anda ingin salinan kompleks atau penggantian nama adalah GNU cp, zmv dari zsh, rsync dan pax (atau cpio). Tidak ada fitur ganti nama di cp, atau (saya pikir) di rsync. Meskipun zmv dapat mengubah nama, ini tidak cocok dengan salinan rekursif. Tetapi pax dapat melakukannya:

cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition

Ini berubah *?:menjadi _. Peringatan: minimal diuji. Jika ada tabrakan, file mana saja yang disalin akan menang terakhir.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bagus - belum pernah menggunakan pax sebelumnya. Terima kasih telah memasukkan saya ke dalamnya.
mo-seph
1
Backslash juga membuat masalah untuk vfat. Sertakan juga di regexp. Terima kasih!
lzap
Daftar lengkap menurut support.grouplogic.com/?p=1607 adalah: /? <> \: * | "^. Juga tidak dapat diakhiri dengan spasi atau titik dan beberapa nama dicadangkan. Mtools manpage memberikan daftar yang lebih besar: :? + * = [] <> '"\ / |
dhill
Dan catatan yang berbeda dan untuk orang-orang yang memiliki masalah yang sama dengan saya: pax tidak mendukung penggunaan -s dalam kombinasi dengan perintah pembaruan -u. Yaitu akan selalu menyalin file berganti nama lagi bahkan jika mereka sudah ada. Butuh waktu berjam-jam untuk mencari tahu tentang itu.
balu
11

Berdasarkan posting oleh Gilles saya menguji daftar berikut:

#!/bin/sh
touch questionmark?
touch less<
touch less\<
touch more\>
touch backslash\\
touch colon:
touch asterisk\*
touch pipe\|
touch inch\"
touch carret\^
touch comma,
touch semicolon\;
touch plus+
touch equals=
touch lbracket[
touch rbracket]
touch quote\'

Saya mencoba untuk menyalinnya ke kartu MicroSDHC ponsel Android dengan sistem file vfat dan paxperintah halus sampai semuanya bekerja. Itu mungkin masih belum cukup untuk Windows dan Unicode:

pax -rw -s '/[?<>\\:*|\"]/_/gp' source dest

Anda mungkin juga ingin menggunakan opsi -k untuk memastikan tidak ada overwrite (karena tabrakan pada nama file). Kedua daftar yang saya berikan di komentar berbeda dari perilaku Linux vfat.

bukit pasir
sumber
0

Saya menerima "Argumen tidak valid" ketika menyalin dengan cp -r sumber usbstick dan menemukan penyebabnya adalah namafile nama file yang diakhiri dengan spasi. Menghapus ruang membersihkan pesan. File dengan nama yang salah terjadi BTW dalam hal ini berada di direktori program mailer.

JohanArnold
sumber
0

Saya hanya punya alasan untuk perlu melakukan ini, dan sementara paxjawaban berbasis itu baik, masih mengalami masalah dengan karakter beraksen.

Jadi saya merasa lebih mudah untuk menggunakan tardan mendapatkannya untuk mengganti semua karakter yang tidak diizinkan dengan garis bawah:

cd /parent-of-source
tar cf - Söurce | (cd /destination; tar xvf - --transform='s/[^A-Za-z0-9\/ ]/_/g')

Tidak diragukan lagi mungkin untuk membuat daftar karakter yang diizinkan yang lebih baik daripada yang di atas, tetapi ini berhasil.

MadHatter
sumber
0

Setelah membaca jawaban atas pertanyaan yang sangat menarik ini dan melakukan beberapa percobaan dengan kartu SD untuk Android (exfat) dan sistem hiburan mobil (vfat), saya muncul menggunakan skrip bash kecil ini.

#! /bin/bash

DST=$1
# copy music to FAT media

find music/ Music/ -type f | while read f ; do
    d=$DST/$( echo $f | sed 's/[^-A-Za-z0-9/._ ()]/_/g' )

    echo :$d:
    mkdir -p "$(dirname "$d")"
    cp -n "$f" "$d"

done

Dibutuhkan tujuan (mount point) sebagai argumen dan digunakan finduntuk menemukan semua file di repositori musik saya.

Untuk setiap jalur file, ini menghitung jalur tujuan dan nama file dengan mendahului tujuan dan mengganti karakter yang menyinggung dengan garis bawah _. Saya menggunakan daftar putih karakter (huruf, angka, -, /, ., . (, )Dan _) untuk menghilangkan tanda baca yang tidak diinginkan.

Bergantung pada lokasinya, ini akan meninggalkan huruf beraksen di jalur dan nama file, yang OK untuk sistem file FAT modern, seperti yang terlihat.

Untuk setiap jalur dan nama file tujuan, direktori dibuat sesuai kebutuhan menggunakan mkdir -p, kemudian file disalin, kecuali sudah ada.

Perhatikan kutipan "karakter di berbagai tempat, mereka diminta untuk menjaga jalur dan nama dengan spasi di dalamnya agar tidak berantakan.

Ber
sumber