Linux คัดลอกไปยังระบบไฟล์ fat32: อาร์กิวเมนต์ไม่ถูกต้อง


12

เมื่อฉันคัดลอกไฟล์จากพาร์ติชัน ext3 ไปยังไฟล์ fat32 โดยใช้ cp:

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

ฉันได้รับข้อความโต้แย้งที่ไม่ถูกต้องสำหรับไฟล์ทั้งหมดที่มีเครื่องหมายโคลอนและเครื่องหมายคำถาม

มีวิธีใดที่จะทำให้ cp ตัดออกอักขระที่ไม่ถูกต้องสำหรับระบบไฟล์เป้าหมายหรือไม่?

แก้ไข: ฉันได้ตรวจสอบผ่านตัวเลือกของ cp อีกครั้งและถ้าฉันไม่ได้โง่ก็ไม่มีอะไรในนั้น ฉันแน่ใจว่าฉันสามารถเขียนสคริปต์ แต่รู้สึกว่าควรมีวิธีแก้ปัญหาที่สะอาดกว่า!

คำตอบ:


10

ผู้ต้องสงสัยตามปกติเมื่อคุณต้องการสำเนาหรือเปลี่ยนชื่อที่ซับซ้อนคือ GNU cp, zmv จาก zsh, rsync และ pax (หรือ cpio) ไม่มีคุณสมบัติการเปลี่ยนชื่อใน cp และ (ฉันคิดว่า) ใน rsync ในขณะที่ zmv สามารถเปลี่ยนชื่อได้สิ่งนี้ไม่ได้ดีกับสำเนาแบบเรียกซ้ำ แต่ท่านสามารถทำได้:

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

สิ่งนี้เปลี่ยน*?:ไป_เป็น คำเตือน: ทดสอบน้อยที่สุด หากมีการชนกันไฟล์ใดก็ตามที่คัดลอกจะชนะครั้งสุดท้าย


นิสัยดี - ไม่เคยใช้ pax มาก่อน ขอบคุณที่ทำให้ฉัน
mo-seph

1
แบ็กสแลชยังทำให้เกิดปัญหากับ vfat รวมไว้ใน regexp เช่นกัน ขอบคุณ!
lzap

รายการทั้งหมดตามsupport.grouplogic.com/?p=1607คือ: /? <> \: * | ” ^. นอกจากนี้มันไม่สามารถลงท้ายด้วยช่องว่างหรือจุดและบางชื่อถูกสงวนไว้ Mtools manpage ให้รายการที่ยิ่งใหญ่กว่า:,; : + * = [] <> '"\ / |
dhill

และบันทึกย่อที่แตกต่างกันและสำหรับผู้ที่มีปัญหาเดียวกันกับฉัน: pax ไม่สนับสนุนการใช้ -s ร่วมกับคำสั่ง update -u นั่นคือมันจะคัดลอกไฟล์ที่ถูกเปลี่ยนชื่ออีกครั้งเสมอแม้ว่าจะมีอยู่แล้ว ฉันใช้เวลาหลายชั่วโมงกว่าจะรู้เรื่องนี้
Balu

11

อ้างอิงจากโพสต์โดย Gilles ฉันทดสอบรายการต่อไปนี้:

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

ฉันพยายามที่จะคัดลอกลงในการ์ด MicroSDHC ของโทรศัพท์ Android ที่มีระบบไฟล์ vfat และpaxคำสั่งกลั่นกรองจนกระทั่งทุกอย่างทำงาน นั่นอาจยังไม่เพียงพอสำหรับ Windows และ Unicode:

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

คุณอาจต้องการใช้ตัวเลือก -k เพื่อให้แน่ใจว่าไม่มีการเขียนทับ (เนื่องจากการชนในชื่อไฟล์) รายการทั้งสองที่ฉันให้ในความคิดเห็นนั้นแตกต่างจากพฤติกรรมของ Linux vfat


0

ฉันได้รับ "อาร์กิวเมนต์ไม่ถูกต้อง" เมื่อคัดลอกด้วย usb แหล่ง cp -r และพบว่าสาเหตุคือชื่อไฟล์ที่ลงท้ายด้วยช่องว่าง การลบพื้นที่เป็นการลบข้อความ ไฟล์ที่มีชื่อไม่ถูกต้องเกิดขึ้น BTW ในกรณีนี้ให้อยู่ในไดเรกทอรีโปรแกรมจดหมาย


0

ฉันเพิ่งต้องทำสิ่งนี้และในขณะที่paxคำตอบที่ใช้นั้นดี แต่ก็ยังคงมีปัญหากับตัวละครที่เน้นเสียง

ดังนั้นฉันจึงพบว่าใช้งานง่ายกว่าtarและนำมาแทนที่อักขระที่ไม่ได้รับอนุญาตทั้งหมดด้วยเครื่องหมายขีดล่าง:

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

ไม่ต้องสงสัยเลยว่าจะมีรายการอักขระที่ได้รับอนุญาตดีกว่าตัวละครที่กล่าวมาด้านบน แต่ใช้งานได้ดีกว่า


0

หลังจากอ่านคำตอบของคำถามที่น่าสนใจนี้และทำการทดลองกับการ์ด SD สำหรับ Android (exfat) และระบบความบันเทิงในรถยนต์ (vfat) ฉันก็เกิดสคริปนี้ขึ้นมาเล็กน้อย

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

ใช้ปลายทาง (จุดเชื่อมต่อ) ตามที่โต้แย้งและใช้findเพื่อค้นหาไฟล์ทั้งหมดในที่เก็บเพลงของฉัน

สำหรับเส้นทางของไฟล์แต่ละมันคำนวณเส้นทางปลายทางและชื่อไฟล์โดย prepending ปลายทางและแทนที่ตัวอักษรที่กระทำผิดกฎหมายใด ๆ _ที่มีการขีดเส้นใต้ ผมใช้สีขาวรายการของตัวอักษร (ตัวอักษรตัวเลข-, /, ., . (, )และ_) เพื่อเอาเครื่องหมายวรรคตอนที่ไม่พึงประสงค์

สิ่งนี้จะทำให้ตัวอักษรเน้นเสียงอยู่ในพา ธ และชื่อไฟล์ซึ่งก็โอเคสำหรับระบบไฟล์ FAT ที่ทันสมัยอย่างที่เห็น

สำหรับแต่ละพา ธ และชื่อไฟล์ปลายทางจะมีการสร้างไดเรกทอรีตามที่ต้องการโดยใช้mkdir -pจากนั้นไฟล์จะถูกคัดลอกเว้นแต่จะมีอยู่แล้ว

สังเกตเครื่องหมายคำพูด"ในสถานที่ต่าง ๆ พวกเขาจะต้องให้เส้นทางและชื่อกับช่องว่างในพวกเขาจากการแยก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.