[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:29644] Re: Samba sjis file restore



佐野@浜松です。

In <3B845A5E.6060409@xxxxxxxxx>,
  on "Thu, 23 Aug 2001 10:19:53 +0900',
   with "[debian-users:29618] Samba sjis file restore",
 Tomoo Nmura <nomurat@xxxxxxxxx> さん wrote:

> Samba のファイル共有を、coding system = sjis で運用していました。
> バックアップを  tar -cf /dev/nst0 *    として取っていたのですが、復元で
> きずに困っています。

復元だけができないのですね ? そもそもアーカイブに入っていない
ということでは無く ?

 (名前に "/" が入っている、というような話だと、そもそも
  そうしたファイルを作成できないような気がするので、
  tar でアーカイブすることも無理だろうな、と。)

 sjis でやったことは無いのですが、cap で運用していて、ファイル名に
例えば ' (single quote) とか " (double quote) とかあるいはスペース
などが含まれているためにバックアップ (アーカイブの作成) 自体がうまく
いかない、という話は以前経験したことがあったような気がするんだけど、
別な話だったかな ?

その時はたしか find の -print0 オプションと xargs の -0 オプションを
使って対処したはずなのですが。

> あるsjis名のフォルダーを復元したいのですが、
> 
>    tar -xvf /dev/nst0 アイウエオ
> 
> とすると、ファイル名のところにコントロールコードが入るのか、
> うまく行きません。

試しに sjis で「アイウエオ」という名前のディレクトリを作ってみましたが
別に問題無さそうです。

 $ mkdir $(echo アイウエオ|nkf -s)
 $ ls -lsaR|nkf  
.:
合計 12
   4 drwxrwxrwx    3 root     root         4096 Aug 25 15:45 .
   4 drwxrwxrwt    9 root     root         4096 Aug 25 15:36 ..
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:45 アイウエオ

./アイウエオ:
ケ邱ラ 8
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:45 .
   4 drwxrwxrwx    3 root     root         4096 Aug 25 15:45 ..
 $ touch $(echo アイウエオ|nkf -s)/$(echo これはファイルです。|nkf -s)
 $ ls -lsaR|nkf -e
.:
合計 12
   4 drwxrwxrwx    3 root     root         4096 Aug 25 15:45 .
   4 drwxrwxrwt    9 root     root         4096 Aug 25 15:36 ..
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:46 アイウエオ

./アイウエオ:
ケ邱ラ 8
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:46 .
   4 drwxrwxrwx    3 root     root         4096 Aug 25 15:45 ..
   0 -rw-rw-r--    1 sano     sano            0 Aug 25 15:46 これはファイルです。

 $ tar -cvzf sjis.tgz ./$(echo アイウエオ|nkf -s)
./\203A\203C\203E\203G\203I/
./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B
[pika] $ tar -tvzf sjis.tgz 
drwxrwxr-x sano/sano         0 2001-08-25 15:46:00 ./\203A\203C\203E\203G\203I/
-rw-rw-r-- sano/sano         0 2001-08-25 15:46:00 ./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B
[pika] $ mkdir check
[pika] $ cd check
[pika] $ tar -xvzf ../sjis.tgz 
./\203A\203C\203E\203G\203I/
./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B
[pika] $ ls -lsaR|nkf -e
.:
合計 12
   4 drwxrwxr-x    3 sano     sano         4096 Aug 25 15:46 .
   4 drwxrwxrwx    4 root     root         4096 Aug 25 15:46 ..
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:46 アイウエオ

./アイウエオ:
ケ邱ラ 8
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:46 .
   4 drwxrwxr-x    3 sano     sano         4096 Aug 25 15:46 ..
   0 -rw-rw-r--    1 sano     sano            0 Aug 25 15:46 これはファイルです。

「問題が発生したファイル名」というのは「アイウエオ」ではなく
何か別なものですね。

例えば
 tar -tvzf ./sjis.tgz |
 perl -ne 
  'chomp; $name=$_; s/\\([0-7][0-7][0-7])/pack('c',oct($1))/ge;print $_ . "\n";'
 |nkf -e

みたいにすれば sjis encoded なファイル名でもリストを取れると思いますが、
どれが「問題の発生する文字」なのか、特定できますか ?

drwxrwxr-x sano/sano         0 2001-08-25 16:25:17 アイウエオ/
-rw-rw-r-- sano/sano         0 2001-08-25 15:46:00 アイウエオ/これはファイルです。
-rw-rw-r-- sano/sano        16 2001-08-25 16:25:05 アイウエオ/試行錯誤、日々是精進


> しかたなく、全部復元しようと思い、
> 
>    tar -xvf /dev/nst0 *
> 
> としたのですが、やはりあるファイルのところで、だんまりになります。
> 
>    tar -xvf /dev/nst0  \205k\201[........
> 
> というふうにファイル名を指定するのかとも思ったのですが、
> これではだめなようです。
> sjis名のファイルを復元するには、どのように指定したらよいのでしょうか?

「あるファイル」という情報だけでは、どういう現象が起きているのか
わかりませんからこれではダメかもしれませんが、一応以下のような
ことは手元の potato では実行可能です。(上記で作成した tar file を
使用しています)

 $ cat >filename01.txt (終了は Ctrl-D で)
./アイウエオ/これはファイルです。^@./アイウエオ^@ $ 
 $ nkf -s filename01.txt >filename01.sjis
 $ tar --null -T filename01.sjis -tvzf ../sjis.tgz 
drwxrwxr-x sano/sano         0 2001-08-25 15:46:00 ./\203A\203C\203E\203G\203I/
-rw-rw-r-- sano/sano         0 2001-08-25 15:46:00 ./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B
 $ tar --null -T filename01.sjis -xvzf ../sjis.tgz 
./\203A\203C\203E\203G\203I/
./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B
 $ ls -lsaR |nkf -e
.:
合計 28
   4 drwxrwxr-x    3 sano     sano         4096 Aug 25 16:20 .
   4 drwxrwxrwx    4 root     root         4096 Aug 25 15:46 ..
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:18 filename01.sjis
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:18 filename01.txt
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:19 filename02.sjis
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:19 filename02.txt
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:46 アイウエオ

./アイウエオ:
ケ邱ラ 8
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 15:46 .
   4 drwxrwxr-x    3 sano     sano         4096 Aug 25 16:20 ..
   0 -rw-rw-r--    1 sano     sano            0 Aug 25 15:46 これはファイルです。
 $ rm -rf $(echo アイウエオ|nkf -s)
 $ ls -lsaR
.:
合計 24
   4 drwxrwxr-x    2 sano     sano         4096 Aug 25 16:21 .
   4 drwxrwxrwx    4 root     root         4096 Aug 25 15:46 ..
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:18 filename01.sjis
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:18 filename01.txt
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:19 filename02.sjis
   4 -rw-rw-r--    1 sano     sano           47 Aug 25 16:19 filename02.txt

ここでちょっと面白いことに、ディレクトリ名とファイル名の順番を
逆にするとうまくいきませんね。

 $ cat >filename02.txt
./アイウエオ^@./アイウエオ/これはファイルです。^@ $ hex filename02.txt 
0x00000000: 2e 2f a5 a2 a5 a4 a5 a6 - a5 a8 a5 aa 00 2e 2f a5 ./アイウエオ@./ア
0x00000010: a2 a5 a4 a5 a6 a5 a8 a5 - aa 2f a4 b3 a4 ec a4 cf .イウエオ/これは
0x00000020: a5 d5 a5 a1 a5 a4 a5 eb - a4 c7 a4 b9 a1 a3 00    ファイルです。@
 $ nkf -s filename02.txt >filename02.sjis
 $ tar --null -T filename02.sjis -tvzf ../sjis.tgz 
drwxrwxr-x sano/sano         0 2001-08-25 15:46:00 ./\203A\203C\203E\203G\203I/
-rw-rw-r-- sano/sano         0 2001-08-25 15:46:00 ./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B
tar: ./\203A\203C\203E\203G\203I/\202202202203t\203@\203C\203\213\202202201B: 書庫中に見つかりません
tar: エラー終了が前のエラーから遅れました

これは最初の ./アイウエオ で ./アイウエオ 以下のファイルが展開されて
しまうためにそれ以降のファイルが見つからない、ということなんでしょうか。

他の例で試してみると、

 $ tar -tvzf test.tgz test1/ test1/test2/test3 
drwxrwxr-x sano/sano         0 2001-08-25 16:36:33 test1/
drwxrwxr-x sano/sano         0 2001-08-25 16:36:38 test1/test2/
-rw-rw-r-- sano/sano         0 2001-08-25 16:36:38 test1/test2/test3
tar: test1/test2/test3: 書庫中に見つかりません
tar: エラー終了が前のエラーから遅れました
 $ tar -tvzf test.tgz test1/test2/test3 test1/
drwxrwxr-x sano/sano         0 2001-08-25 16:36:33 test1/
drwxrwxr-x sano/sano         0 2001-08-25 16:36:38 test1/test2/
-rw-rw-r-- sano/sano         0 2001-08-25 16:36:38 test1/test2/test3

別にファイル名のコードが ASCII でも同じ動作みたいですね。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)