fat32ファイルシステムへのLinuxコピー:無効な引数


12

cpを使用してext3パーティションからfat32パーティションにファイルをコピーすると:

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

コロンと疑問符が含まれるすべてのファイルに対して無効な引数メッセージが表示されます。

ターゲットファイルシステムの無効な文字を取り除くためにcpを取得する方法はありますか?

編集:私は再びcpのオプションをチェックしました、そして私が愚かでなければ、そこには何もありません。私はスクリプトを書くことができると確信していますが、よりクリーンなソリューションがあるべきだと感じています!

回答:


10

複雑なコピーや名前の変更が必要な場合の通常の疑いは、GNU cp、zshのzmv、rsync、pax(またはcpio)です。cpには名前変更機能も、rsyncにも(と思う)名前変更機能はありません。zmvは名前を変更できますが、これは再帰的なコピーではうまく機能しません。しかし、paxはそれを行うことができます。

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

これにより、それぞれが*?:に変わります_。警告:最小限のテスト。衝突がある場合、最後にコピーされたファイルが優先されます。


ニース-以前にpaxを使用したことがありません。それに私を置いてくれてありがとう。
mo-seph

1
バックスラッシュもvfatに問題を引き起こします。同様に正規表現に含めます。ありがとう!
lzap

support.grouplogic.com/?p=1607に基づく完全なリストは次のとおりです。<> \:* | 」^。また、スペースまたはドットで終わることはできず、一部の名前は予約されています。Mtoolsのマンページには、さらに大きなリストがあります:、; ?+ * = [] <> ' "\ / |
dhill

そして、私と同じ問題を抱えている人々への別の注意:paxは、更新コマンド-uと組み合わせた-sの使用をサポートしていません。つまり、名前が変更されたファイルが既に存在する場合でも、常にコピーされます。それを知るのに何時間もかかった。
バル14年

11

ジルの投稿に基づいて、次のリストをテストしました。

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

paxすべてが機能するまで、vfatファイルシステムと洗練されたコマンドを使用して、AndroidフォンのMicroSDHCカードにコピーしようとしました。それでも、WindowsとUnicodeでは十分ではありません。

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

-kオプションを使用して、上書きがないことを確認することもできます(ファイル名の衝突による)。コメントで私が付けたリストは両方とも、Linux vfatの動作とは異なりました。


0

cp -r source usbstickでコピーすると「無効な引数」が返され、原因がスペースで終わるsourcefilenameであることがわかりました。スペースを削除すると、メッセージが消去されました。この場合、誤った名前のファイルがメーラープログラムのディレクトリにあることがわかりました。


0

私はこれをする必要があるだけで、- paxベースの答えは良かったのですが、それでもアクセント文字の問題に遭遇しました。

したがってtar、許可されていないすべての文字をアンダースコアに置き換えるために使用する方が簡単であることがわかりました:

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

上記よりも許可された文字のより良いリストを考え出すことは間違いなく可能ですが、これは機能します。


0

この非常に興味深い質問への回答を読んで、Android用SDカード(exfat)とカーエンターテイメントシステム(vfat)を試した後、この小さなbashスクリプトを作成しました。

#! /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し、音楽リポジトリ内のすべてのファイルを見つけるために使用します。

各ファイルパスについて、宛先を先頭に追加し、問題のある文字をアンダースコアで置き換えることにより、宛先パスとファイル名を計算します_。私は文字(文字、数字、のホワイトリストを使用-/.()との_不要な句読点を削除します)。

ロケールによっては、パスとファイル名にアクセント記号付きの文字が残ります。これは、最近のFATファイルシステムでは問題ないようです。

宛先ファイルのパスと名前ごとに、を使用して必要に応じてディレクトリが作成されmkdir -p、ファイルが既に存在しない限りコピーされます。

"さまざまな場所の引用文字に注意してください。スペースを含むパスと名前がバラバラにならないようにするために必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.