問題がどのように解決されたかを伝えるためにこの回答を投稿し、元の質問に対するコメントを要約します。これは他の人にとって役立つかもしれません.
これらのフォルダーが作成された Linux の問題を修正しました。2 つまたは 3 つのビデオ ファイルのタイトルを短くするだけで済みました。これらのファイルには長い名前がありましたが、コンマやブラケットなどの明らかに奇妙な文字はありませんでした。フォルダーも変更しました。名前—特別なことは何もありませんでしたが。それらを元に戻しても問題は再現しませんでした。
そのため、フォルダ名に Linux では表示されない間違った文字が含まれていたか、名前が変更された 3 つのファイルの一部に間違った文字が含まれていたため、Mac ではフォルダ全体が表示されず、すべて 表示されませんでした。 Windows では再生できない内容が含まれています。
これは、フォルダーと 3 つのファイルの名前を変更する前に、none という最も奇妙なことです。 のファイルが Windows で再生可能でした。
@Giacomo1968 がコメントで言ったように、そうであったかもしれません:
<ブロック引用>「…元のファイル名の「ファントム」文字…Linux では 1 つの方法で処理されたが、他のシステムでは詰まるキャリッジ リターンまたは非改行スペースのようなもの。」
問題は、問題を修正する前に、最終的に名前が変更されたファイル以外のファイルを Windows で再生しようとしたことです。フォルダ名にも幻の文字が含まれていた可能性があります。
コピー中にNemoファイルマネージャーによってLinuxでエラーが報告されたフォルダー内の他のファイルとともにexFATとしてフォーマットされた新しいドライブで再び発生しました(「ファイルを作成できません」など)が、実際にはすべて問題なく見えましたLinux。そのフォルダーは表示されましたが、Windows では完全にアクセスできず (ファイルまたはフォルダーが存在しないというエラー メッセージは正確には覚えていません)、Mac では 1 つのファイルを除いて表示されませんでした。 Linux でフォルダとファイルの名前を 同じ名前 に変更した後 すべて正常に進みました!
質問で報告された最初の問題と、不適切な「ファントム」キャラクターの作成の原因は、コピー プロセス中の何らかのエラーだったのではないかと考えています。 または インターネット ページからコピーしたテキストのタイトルへの貼り付け (たとえば、スペースのように見えるものは、実際には別のものです)。これは、Linux で Double Commander を使用してコピーしているときに、タブ文字または類似のものである可能性のあるスペースを含むいくつかの名前で詳細なエラーが報告されたという事実によって私に示唆されました.
最終的に、コピーの最善の解決策は、Linux で Double Commander を使用することでした。これは、問題のあるファイル名を非常に明確に示していました。
ファイルやフォルダーに名前を付ける際のインターネット テキストのコピー/貼り付けは、注意して行う必要があります。
Windows でファイル/フォルダー名が機能する方法については、Microsoft の Web サイトで説明されています。ただし、それは全体的な真実を垣間見るだけです。
<ブロック引用>注意:私はしません 「外部」システムが NTFS ボリュームにアクセスする方法から発生する可能性があるコードページの問題の側面について説明します。これはコメントと他の回答で十分にカバーされていると思います。主に次の 2 つの側面に限定します。
- パス名の長さの制限
- Win32 サブシステムからアクセスするのが難しい/不可能な文字の組み合わせ
ファイルシステムに関しては、質問と同じように NTFS に限定します。上記のリンク先の Web サイトからの次のコメントを検討してください:
<ブロック引用>ファイル名またはディレクトリ名をスペースまたはピリオドで終わらせないでください。 基盤となるファイル システムはそのような名前をサポートしている可能性がありますが、Windows シェルとユーザー インターフェースはサポートしていません .
ここで、まずいくつかの用語を理解する必要があります。さまざまな ... レイヤーを扱っていますが、おそらく適切な用語です:
- ファイル システム。 NTFS
- NT オブジェクト マネージャーとその他のカーネル機能ですが、名前に関してはほとんど オブジェクトマネージャー
(見たい場合は、WinObj などのツールを使用してください) - Win32 サブシステム (これは、上記のステートメントで「Windows シェルとユーザー インターフェイス」と呼ばれるものです)
- 別の「メタ アスペクト」は OS のバージョンです。サポートされるパスの長さはさまざまであるため
これをいじる良い方法は、クライアント側に対して NTFS のふりをする Samba 共有です。ただし、Windows NTFS ボリュームでも十分です。 Windows 上で、コマンド ラインから「遊んで」みます (Win を押します)。 +R cmd
と入力します 、次に Enter を押します ).
ローカル NTFS ボリューム
無効なファイル名を作成したいとします (末尾のドットに注意してください!):
echo NONSENSE > text.txt.
これを試みると、結果は確かに test.txt
になります 、しない test.txt.
. Win32 サブシステム (csrss.exe) のおかげで、私たちは愚かなことをすることができなくなりました。うーん、面白いですね。
次の別のステートメントを検討してください:
<ブロック引用>ファイル名に次の予約名を使用しないでください:
CON
、 PRN
、 AUX
、 NUL
、 COM1
、 COM2
、 COM3
、 COM4
、 COM5
、 COM6
、 COM7
、 COM8
、 COM9
、 LPT1
、 LPT2
、 LPT3
、 LPT4
、 LPT5
、 LPT6
、 LPT7
、 LPT8
、および LPT9
.また、これらの名前の直後に拡張子を付けることも避けてください。例:NUL.txt
推奨されません。
うーん、NUL
楽しいように聞こえる。 /dev/null
の代用であることから、 unixoid システムでは、DOS 時代から継承されています。
echo NONSENSE > NUL
ああ、そうですね。 /dev/null
の代わりです 、そのため、出力が飲み込まれます。ただし、使用しないでください とても魅力的に聞こえます。そこで、Project Zero ブログ記事の「ローカル デバイス」セクションから要約された情報を使用しましょう。
短い間奏:%CD%
従来の Windows コマンド ライン (cmd.exe
)、特殊変数 %CD%
現在の作業ディレクトリへの絶対パスが表示されます。次のセクションでは、そのことを念頭に置いてください。したがって、現在 C:\test
内にいた場合 、コマンド echo %CD%
出力 C:\test
が得られます .実験の便利なショートカットです。
Project Zero の記事からわかるように、Win32 サブシステム レベルでパス名の変換を回避する方法はいくつかあります。そのような方法の 1 つは、プレフィックス \\?\
です。 内部的に直接 \??\
に変換 、新しい Windows バージョンでは \GLOBAL??\
と同じです .これはオブジェクト ディレクトリと呼ばれます (ファイル システム エンティティと混同しないでください)。 、似たような用語にもかかわらず!)。繰り返しになりますが、WinObj や同様のツールを使用すると、オブジェクト マネージャーの名前空間を調査できます。
幕間:名前空間とターミナル サーバーの「もの」
Windows NT の歴史を調べ、Windows 10 のルーツを NT に遡ることができる人なら誰でも、ターミナル サービスのライセンスを個別に取得しなければならなかった時代を覚えているでしょう。つまりさまざまなユーザーがリモートで 1 台のマシンに接続する機能。
複数のユーザー アカウントで同時にログオンした状態を維持できるようにすることで ("ユーザー切り替え")、最終的に大衆にこれをもたらしたのは Windows XP だったと思います。おそらく Windows 2000 または 2003 Server では、CALデフォルトで含まれる最小「シート」を超えて必要でした。
ここが \??
の違いです と \GLOBAL??
由来します。 \GLOBAL??
すべてが共有する「DOS」デバイス名のビューです ログオン セッション。
\??
最近では、シンボリック リンクで見られます (繰り返しますが、ファイル システム エンティティではありません! ) \DosDevices
と呼ばれる 、その起源についての手がかりを与えます。これは、C:
などの「DOS」デバイス名の場所です。 またはネットワーク ドライブ マッピングが存在します。最新のシステム C:
では 次に、\Device\HarddiskVolume1
へのシンボリック リンクになります。 (または類似)。それは通常 実際の ストレージ ドライバ スタック内の何らかのドライバによって作成されたデバイス オブジェクト。この場合は すべき NTFS ファイル システム ドライバーになります。
C:\Windows\explorer.exe
をダブルクリックすると 内部で何が起こるかというと、パスが変換されます:
- Win32 サブシステム レベルでの通常の変更は、先頭に
\??\
を追加することです。 . - オブジェクト マネージャは、
\??\C:
を展開します。 .- 最初の
\??\
ログオン セッションの「DOS」デバイス名前空間で終了します (以下の説明を参照) - 最終的に、オブジェクト マネージャは
\??\C:
のような値を計算します。\GLOBAL??\C:
と同等 これは - 上で見たように -\Device\HarddiskVolume1
と同等です .
- 最初の
オブジェクト マネージャはパス \Windows\explorer.exe
の残りを渡します。 デバイスオブジェクト \Device\HarddiskVolume1
を担当するドライバーへ 、どのデバイス オブジェクトが参照されたかをドライバーが認識していることを確認します。そして、そのドライバーは、独自の名前空間内でパスの特定の残りの部分を処理する方法を認識します。
備考: \??
を参照する場合 内部的には、ローカル ログオン セッションの「DOS」デバイスが表示されます。これは、マップされたネットワーク ドライブで最もよく説明できます。ドライブ文字 X:
があるとします リモート共有にマップされます。また、「ユーザー切り替え」を利用したり、別の 200 人のユーザーが同時にログオンしている強力なターミナル サーバーで実行されているとします。このようなシナリオでは、2 つの問題が発生します。システム ドライブ (物理ディスクなど) は全員で共有されている場合がありますが、営業担当者が「 販売シェア" として X:
開発担当者が「」をマッピングした可能性があります subst
経由で割り当てられた「ドライブ文字」についても同様です。 .これは、すべての人に適合する「DOS」デバイス名用の単一のグローバル名前空間が存在できない理由を説明するはずです。
したがって、私たちの目標は ファイル を作成することでした (またはディレクトリ) NUL
という名前 Win32 サブシステムではそれができませんでした。出力を飲み込んだだけで、作業ディレクトリにファイルが作成されることはありませんでした。ただし、上記のリンクされた記事と前のインターリュードからの情報を活用して、サブシステム レベルでこれらの厄介なパス変換を回避することで、これを回避できます。
echo NONSENSE > \\?\%CD%\NUL
念のため、%CD%
現在の作業ディレクトリの絶対パスに展開され、それが C:\test
であると仮定します 、上記のコマンドは echo NONSENSE > \\?\C:\test\NUL
と同等です .
そして見よ、素早い dir
ファイルが作成されたことを証明します。他の「予約済み」の名前で試してみると、うまくいきます。
actual も使用できることに注意してください。 ネイティブ NT パス形式 (\??
\\?
の代わりに ) 同じ効果:
echo NONSENSE > \??\%CD%\NUL
いいですね。
では、末尾のドットの試行を再検討して、Win32 サブシステムに干渉させずにフル パスを指定するのはどうですか?:
echo ILLEGAL TRAILING DOT > \??\%CD%\test.txt.
出来上がり、素早く dir /b
として動作します 証明:
C:\test>dir /b
CON
NUL
test.txt
test.txt.
<ブロック引用> 幕間:UNC (Universal Naming Convention) パス
このトピックについては、その Project Zero の記事で詳しく説明していますが、上記で使用したものと非常によく似た特別な形式のパスがあることを述べておけば十分です:\\.\C:\Windows\explorer.exe
マシンのローカル マシン名を覚えておらず、ログオン画面で立ち往生している場合はいつでも、メンバーであるドメインにデフォルト設定されることを覚えていますか? 現在のマシンを参照する簡単な方法 実際の名前を使わなくても .\username
です 、ユーザー username
を参照できるようにします 現在のマシン .
.
\\.\C:\Windows\explorer.exe
で 同様に理解すべきです。実際、あなたが言っているのは \\.
です 現在のマシンで \C:
ドライブ C:
で アクセスパス \Windows\explorer.exe
...そして、OS のさまざまな機能が互いに結びついてそれを実現します。
注意 :UNC パスは異なる一連のルールに従います。詳細に興味がある場合は、リンクされた記事と Microsoft ドキュメントへのリンクをお読みください。
ついに「不可能な」ファイル test.txt.
を作成したので、 、見てみましょうか?
C:\test>type test.txt
NONSENSE
一体何? ILLEGAL TRAILING DOT
をエコーしたことをはっきりと覚えています そのファイルに。
あ、もちろん。最初に test.txt.
を作成しようとしたときと同じように Win32 サブシステムが再び介入し、「親切に」私たちの名前を test.txt
に変換しました .つまり、実際に見ているのは \??\%CD%\test.txt
です \??\%CD%\test.txt.
の代わりに .
C:\test>type \??\%CD%\test.txt.
ILLEGAL TRAILING DOT
ずっといい。問題は、すべてのプログラムが、Win32 パス名変換の巧妙な回避を cmd.exe
のように適切に処理できるわけではないことです。 .メモ帳を開きたいとします:
C:\test>notepad \??\%CD%\test.txt.
次のメッセージ ボックスが表示されます:
一部を回避する方法はありますが、 Win32 サブシステムによって課せられた制限があるため、これらのメソッドの有用性は限定的で疑わしいものです。
注意 :開発も行う読者 Windows 上の/用のソフトウェアは、プレフィックス \\?\
を使用してそれを思い出すかもしれません MAX_PATH
を回避できました 制限 (以前は 260、基本的には 255 プラス \\?\
) および終了 \0
)。これで、約を利用できる理由がわかりました 32767 文字。 UCS-2 が UTF-16 に置き換えられたので (XP ではそうだったと思います)、オブジェクト マネージャ レベルでのパス マングリングは 1 つの問題にすぎません。もう 1 つの問題は、UTF-16 ではコード ポイントが 16 ビット (別名 wchar_t
) を超える可能性があることです。 または WCHAR
)、BMP を置き去りにしたら。
とにかく、コマンドライン (cmd.exe
) は、最初に Windows から作成できたファイルにアクセスして削除するためのすべてのツールを提供します。
NTFS を装う Linux/Samba 共有
ローカル ドライブから離れて、マップされたネットワーク ドライブ Z:
について考えてみましょう。 Windows に関する限り、NTFS ドライブを模倣する Samba 4.x によって提供されます。
Linux 側のルールに従ってファイルを作成でき、Windows 側からファイルにアクセスできないことを心配する必要がないため、この実験はさらにいくつかの洞察を提供します。
- マップされたドライブは
Z:
ですZ:\test
になります Windows 側 - Linux 側では、ボリュームは btrfs としてフォーマットされていました
ウィキペディアの記事では、/
以外のすべての文字が示されています。 と\0
(別名 ASCII NUL 文字) が許可されます!これは楽しいはずです。
Linux 側で Ubuntu 20.04 の Bash を使用して作成し、Windows 側でアクセスするのが困難なはずの (または少なくとも可能性がある) いくつかの贅沢なファイル名を次に示します。
:.txt
(echo "$RANDOM" > \:.txt
で作成) )???.txt
(echo "$RANDOM" > \?\?\?.txt
で作成 ).txt
(echo "$RANDOM" > .txt
で作成) )*.txt
(echo "$RANDOM" > \*.txt
で作成) )\.txt
(echo "$RANDOM" > \\.txt
で作成) )".txt
(echo "$RANDOM" > \".txt
で作成) )>.txt
(echo "$RANDOM" > \>.txt
で作成) )<.txt
(echo "$RANDOM" > \<.txt
で作成) )|.txt
(echo "$RANDOM" > \|.txt
で作成) )
これはほぼすべてのベースをカバーするはずですが、実際には、絵文字はまったく問題にならないかもしれないと考え直しました. NTFS ではスラッシュも禁止されていますが、これは btrfs/POSIX/SUS にも当てはまります。
Linux 側からの証明:
$ find -type f -printf '%P\n'
:.txt
???.txt
.txt
*.txt
\.txt
".txt
>.txt
<.txt
|.txt
それでは、Windows 側でアクセスできるかどうかと、何にアクセスできるかを見てみましょう ...
Z:\test>dir /b
_2X68P~X.TXT
_2X68Q~5.TXT
_2X68Q~9.TXT
_2X68Q~B.TXT
_2X68Q~D.TXT
_2X68R~7.TXT
_2X68S~3.TXT
_67V3K~2.TXT
.txt
証拠としてのスクリーンショット:
ああああ!そうです、Windows の DOS 遺産が再び襲ってきます。 NTFS は、積極的に無効にしない限り、DOS ファイル名の要件に準拠した、いわゆる 8.3 ショート ファイル名を作成する機能を備えています。
これが、無効なファイル名に関係なくアクセスできる方法です。
結論
ここで、質問は外部、つまりローカルの NTFS ドライブに関するものだったことを思い出してください。これは、Samba 共有について観察したルールがここでは適用されない可能性があることを意味します。
これらのファイルを保存するために使用されるドライバー (Linux/macOS のバージョンによって異なる場合があります。たとえば、ntfs-3g または使用されるサードパーティのドライバー、たとえば、Paragon のドライバー) に応じて、上記の実験を調べた後、次のような原因が考えられます。 /P> <オール>
:
が含まれていた 、 "
または ?
... これらの文字を含む電子ブックのタイトルを自分で誤ってコピーして貼り付けたことがあることを考えると、これが最も可能性が高いと思われます。 /
はほとんど除外できます 他の「禁止」文字は、少なくとも可能性が低くなります。最初のシナリオでは、Linux 側で fslint を使用してファイル (およびフォルダー) 名をサニタイズすることをお勧めします。他にも同様のツールが存在し、YMMV を選択してください。
お役に立てれば。考えを書き出すのに十分な時間がかかりました.
さらに読む
- ファイル、パス、名前空間の命名
- Win32 から NT へのパス変換に関する決定版ガイド