Linux sao chép vào hệ thống tập tin fat32: đối số không hợp lệ


12

Khi tôi sao chép tệp từ phân vùng ext3 sang fat32 bằng cp:

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

Tôi nhận được thông báo đối số không hợp lệ cho tất cả các tệp có dấu hai chấm và dấu hỏi.

Có cách nào để có được cp để loại bỏ các ký tự không hợp lệ cho hệ thống tệp đích không?

chỉnh sửa: Tôi đã kiểm tra lại các tùy chọn của cp và trừ khi tôi ngu ngốc, không có gì trong đó. Tôi chắc chắn rằng tôi có thể viết một kịch bản, nhưng cảm giác như cần có một giải pháp sạch hơn!

Câu trả lời:


10

Các nghi phạm thông thường khi bạn muốn các bản sao hoặc đổi tên phức tạp là GNU cp, zmv từ zsh, rsync và pax (hoặc cpio). Không có tính năng đổi tên trong cp, cũng không (tôi nghĩ) trong rsync. Mặc dù zmv có thể đổi tên, nhưng điều này không phù hợp với các bản sao đệ quy. Nhưng pax có thể làm điều đó:

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

Điều này thay đổi từng *?:đến _. Cảnh báo: đã kiểm tra tối thiểu. Nếu có va chạm, tập tin nào được sao chép sẽ giành chiến thắng cuối cùng.


Nice - chưa từng sử dụng pax trước đây. Cảm ơn đã đưa tôi vào nó.
mo-seph

1
Dấu gạch chéo ngược cũng làm cho vấn đề với vfat. Bao gồm nó trong regrec là tốt. Cảm ơn!
lzap

Danh sách đầy đủ theo support.grouplogic.com/?p=1607 là: /? <> \: * | NÓI ^. Ngoài ra, nó không thể kết thúc bằng dấu cách hoặc dấu chấm và một số tên được bảo lưu. Trang chủ Mtools cung cấp danh sách thậm chí còn lớn hơn:,; :? + * = [] <> '"\ / |
damp

Và một lưu ý khác và đối với những người có cùng vấn đề với tôi: pax không hỗ trợ sử dụng -s kết hợp với lệnh cập nhật -u. Tức là nó sẽ luôn sao chép các tập tin được đổi tên một lần nữa ngay cả khi chúng đã tồn tại. Tôi đã mất nhiều giờ để tìm hiểu về điều đó.
balu

11

Dựa trên bài đăng của Gilles, tôi đã kiểm tra danh sách sau đây:

#!/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\'

Tôi đã cố gắng sao chép nó vào thẻ MicroSDHC trên điện thoại Android với hệ thống tập tin vfat và paxlệnh tinh chỉnh cho đến khi mọi thứ hoạt động. Điều đó có thể vẫn chưa đủ cho Windows và Unicode:

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

Bạn cũng có thể muốn sử dụng tùy chọn -k để đảm bảo rằng không có ghi đè (do va chạm trong tên tệp). Cả hai danh sách tôi đưa ra trong nhận xét đều khác với hành vi vfat của Linux.


0

Tôi đã nhận được "Đối số không hợp lệ" khi sao chép bằng usbstick nguồn cp -r và tìm ra nguyên nhân là một tên tệp nguồn kết thúc bằng dấu cách. Xóa không gian xóa tin nhắn. Các tập tin với tên không chính xác đã xảy ra BTW trong trường hợp này là trong các thư mục chương trình gửi thư.


0

Tôi chỉ cần có lý do để làm điều này, và trong khi paxcâu trả lời dựa trên câu hỏi là tốt, nó vẫn gặp vấn đề với các ký tự có dấu.

Vì vậy, tôi thấy đơn giản hơn khi sử dụng tarvà lấy nó để thay thế tất cả các ký tự không được phép bằng dấu gạch dưới:

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

Không nghi ngờ gì có thể đưa ra một danh sách các ký tự được phép tốt hơn so với cái ở trên, nhưng điều này hoạt động.


0

Sau khi đọc câu trả lời cho câu hỏi rất thú vị này và thực hiện một số thử nghiệm với thẻ SD cho Android (exfat) và hệ thống giải trí xe hơi (vfat), tôi đã nghĩ ra kịch bản bash nhỏ này.

#! /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

Nó lấy đích (điểm gắn kết) làm đối số và sử dụng findđể định vị tất cả các tệp trong kho nhạc của tôi.

Đối với mỗi đường dẫn tệp, nó sẽ tính toán một đường dẫn đích và tên tệp bằng cách thêm vào đích và thay thế bất kỳ ký tự vi phạm nào bằng dấu gạch dưới _. Tôi sử dụng một danh sách trắng của ký tự (chữ, số, -, /, ., . (, )_) để loại bỏ bất kỳ dấu chấm câu không mong muốn.

Tùy thuộc vào miền địa phương, điều này sẽ để lại các chữ cái có dấu trong đường dẫn và tên tệp, điều này phù hợp với các hệ thống tệp FAT hiện đại, như có vẻ như vậy.

Đối với mỗi đường dẫn và tên tệp đích, các thư mục được tạo khi cần sử dụng mkdir -p, sau đó tệp được sao chép, trừ khi nó đã tồn tại.

Lưu ý các "ký tự trích dẫn ở nhiều nơi khác nhau, chúng được yêu cầu giữ cho các đường dẫn và tên có không gian trong đó không bị phá vỡ.

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.