web-dev-qa-db-ja.com

mv「引数リストが長すぎます」1つのファイルに対して

mv g* dirを介して、7つのファイルのセットをコンピューターに移動しようとしました。コマンドラインで6つ移動し、最後のファイルで次のエラーが発生しました。

mv: g.tex: Argument list too long

前後のファイルはすでに移動しているので、mv g.tex dirを試してみました。同じエラー。他のファイルの移動は正常に機能します。 (注:g.texはファイルであり、ディレクトリではありません。)

更新:mvを介してファイルの名前を変更することも正常に機能します。 USBドライブ上の別のディレクトリに移動することもできます。ただし、名前を変更したり、USBドライブの別のディレクトリに移動したりしても、コンピュータに移動できません。

このファイルをcatして、その内容をデスクトップにコピーしようとしました。

cat: g.tex: Argument list too long

他に何がこの問題を引き起こしている可能性がありますか?

更新:dtrussの出力を正常に移動したファイルと比較した後、異なるログの行は次のとおりです。

read(0x3, "\0", 0x20000)         = -1 Err#7
write_nocancel(0x2, "mv: \0", 0x4)       = 4 0
getrlimit(0x1008, 0x7FFF5A00BC78, 0x4)       = 0 0
write_nocancel(0x2, "g.tex\0", 0x5)      = 5 0
write_nocancel(0x2, ": \0", 0x2)         = 2 0
write_nocancel(0x2, "Argument list too long\n\0", 0x17)      = 23 0
unlink("/Users/username/Desktop/Tex/g.tex\0", 0x7FFF5A00B8A0, 0x17)      = 0 0
close(0x3)       = 0 0

readのUnixエラーコードのリストから:

#define E2BIG        7  /* Argument list too long */

移動が成功すると、代わりに次のように表示されます。

read(0x3, "Beginning of file contents...", 0x20000)      = 0 0
fstat64_extended(0x3, 0x7FF1F5C02568, 0x7FF1F5C02660)        = 0 0
fstat64(0x4, 0x7FFF5A653EF0, 0x7FF1F5C02660)         = 0 0
fchmod(0x4, 0x180, 0x7FF1F5C02660)       = 0 0
__mac_syscall(0x7FFF8E670D02, 0x52, 0x7FFF5A653E70)      = -1 Err#93
flistxattr(0x4, 0x0, 0x0)        = 0 0
flistxattr(0x3, 0x0, 0x0)        = 23 0
flistxattr(0x3, 0x7FF1F5C02490, 0x17)        = 23 0
fgetxattr(0x3, 0x7FF1F5C02490, 0x0)      = 11 0
fgetxattr(0x3, 0x7FF1F5C02490, 0x7FF1F6001000)       = 11 0
fsetxattr(0x4, 0x7FF1F5C02490, 0x7FF1F6001000)       = 0 0
fstat64_extended(0x4, 0x7FFF5A653628, 0x7FF1F5C02660)        = 0 0
fchmod_extended(0x4, 0xFFFFFF9B, 0xFFFFFF9B)         = 0 0
fchmod(0x4, 0x0, 0xFFFFFF9B)         = 0 0
close(0x3)       = 0 0
fchown(0x4, 0x6300000063, 0x63)      = 0 0
fchmod(0x4, 0x81FF, 0x63)        = 0 0
fchflags(0x4, 0x0, 0x63)         = 0 0
utimes("/Users/aleksander/Desktop/Tex/new_filename\0", 0x7FFF5A654860, 0x63)         = 0 0

これが役立つ場合に備えて、成功したmvコマンドと失敗したコマンドに一致する残りの行は、上記で引用した異なるテキストの直前にあります。

open("/dev/dtracehelper\0", 0x2, 0x7FFF53E619B0)         = 3 0
ioctl(0x3, 0x80086804, 0x7FFF53E61938)       = 0 0
close(0x3)       = 0 0
thread_selfid(0x3, 0x80086804, 0x7FFF53E61938)       = 167920154 0
bsdthread_register(0x7FFF8E8710F4, 0x7FFF8E8710E4, 0x2000)       = 1073741919 0
ulock_wake(0x1, 0x7FFF53E6116C, 0x0)         = -1 Err#2
issetugid(0x1, 0x7FFF53E6116C, 0x0)      = 0 0
mprotect(0x10BDA5000, 0x88, 0x1)         = 0 0
mprotect(0x10BDA7000, 0x1000, 0x0)       = 0 0
mprotect(0x10BDBD000, 0x1000, 0x0)       = 0 0
mprotect(0x10BDBE000, 0x1000, 0x0)       = 0 0
mprotect(0x10BDD4000, 0x1000, 0x0)       = 0 0
mprotect(0x10BDD5000, 0x1000, 0x1)       = 0 0
mprotect(0x10BDA5000, 0x88, 0x3)         = 0 0
mprotect(0x10BDA5000, 0x88, 0x1)         = 0 0
getpid(0x10BDA5000, 0x88, 0x1)       = 28838 0
stat64("/AppleInternal/XBS/.isChrooted\0", 0x7FFF53E61028, 0x1)      = -1 Err#2
stat64("/AppleInternal\0", 0x7FFF53E610C0, 0x1)      = -1 Err#2
csops(0x70A6, 0x7, 0x7FFF53E60B50)       = 0 0
sysctl([CTL_KERN, 14, 1, 28838, 0, 0] (4), 0x7FFF53E60CA8, 0x7FFF53E60CA0, 0x0, 0x0)         = 0 0
ulock_wake(0x1, 0x7FFF53E610D0, 0x0)         = -1 Err#2
csops(0x70A6, 0x7, 0x7FFF53E60430)       = 0 0
stat64("/Users/aleksander/Desktop/Tex\0", 0x7FFF53E62B88, 0x7FFF53E60430)    = 0 0
lstat64("g.tex\0", 0x7FFF53E62AF8, 0x7FFF53E60430)       = 0 0
lstat64("/Users/aleksander/Desktop/Tex\0", 0x7FFF53E62A68, 0x7FFF53E60430)   = 0 0
stat64("g.tex\0", 0x7FFF53E62AF8, 0x7FFF53E60430)        = 0 0
stat64("/Users/aleksander/Desktop/Tex/g.tex\0", 0x7FFF53E62A68, 0x7FFF53E60430) = -1 Err#2
access("/Users/aleksander/Desktop/Tex/g.tex\0", 0x0, 0x7FFF53E60430)         = -1 Err#2
rename("g.tex\0", "/Users/aleksander/Desktop/Tex/g.tex\0")       = -1 Err#18
stat64("/\0", 0x7FFF53E5FB60, 0x7FFF53E60430)        = 0 0
open_nocancel(".\0", 0x0, 0x1)       = 3 0
fstat64(0x3, 0x7FFF53E5F900, 0x1)        = 0 0
fcntl_nocancel(0x3, 0x32, 0x7FFF53E61980)        = 0 0
close_nocancel(0x3)      = 0 0
stat64("/Volumes/NO NAME\0", 0x7FFF5A00A870, 0x7FFF5A00C980)         = 0 0
stat64("/Volumes/NO NAME\0", 0x7FFF5A00AB60, 0x7FFF5A00C980)         = 0 0
getattrlist("/Volumes/NO NAME/g.tex\0", 0x7FFF8E715B04, 0x7FFF5A00C470)      = 0 0
statfs64(0x7FFF5A00C980, 0x7FFF5A00CD88, 0x7FFF5A00C470)         = 0 0
lstat64("g.tex\0", 0x7FFF5A00C8F0, 0x7FFF5A00C470)       = 0 0
open("g.tex\0", 0x0, 0x0)        = 3 0
open("/Users/aleksander/Desktop/Tex/g.tex\0", 0xE01, 0x0)        = 4 0
fstatfs64(0x4, 0x7FFF5A00BFF8, 0x0)      = 0 0

xattr -l g.texは出力を提供しません。 ls -l g.texは次を生成します:

-rwxrwxrwx 1 username staff 159939 Aug 15 11:54 g.tex

mountは次を生成します:

/dev/disk5s1 on /Volumes/NO NAME (msdos, local, nodev, nosuid, noowners)
4
Alex

E2BIGは、 read(2) が返す可能性のあるエラーの1つではありません。カーネルのバグのようです。

純粋な推測ですが、ファイルシステムの破損とFATファイルシステムのmacOSドライバーが破損に遭遇するとエラーを返し、最終的にはreadが返される可能性があります。

いずれにせよ、あなたは可能な限り調査を行ったようです。さらに進むには、ファイルシステムとカーネルドライバーコードを分析する必要があります。

カーネルログを見て、そこにさらに情報があるかどうかを確認できます。 FSを別のOSにマウントしてみてください。または、GNU mtoolsを使用してそのFATファイルシステムにアクセスしてください。

また、問題をAppleに少なくともドキュメントの問題として報告することもできます(考えられるエラーコードの1つとしてE2BIGと、それが返される可能性のある条件を含めるため)。

5

これを解決する方法を考え出しました。 macPorts経由でGNU mvをインストールしました。そのmvは、E2BIGエラーを返すことなく、ファイルをUSBドライブからコンピューターに移動できました。I dtrussを使って、readからのエラーリターンをどのように回避したかを確認したいと思います。

ファイルポインタがわずかに破損していることが判明しました-したがって、コピーされたファイルは、開始場所より128KB早く開始されましたはず開始されましたが、ファイルの残りの部分は無傷でした(もちろん、最後の128KBも切り落とされました。)

学ぶべき教訓:Macのネイティブ(BSD)ユーティリティは、対応するGNU)とは異なるアルゴリズムを実行するため、一方が失敗した場合は、常にもう一方を試してください。

2
Alex