我试图通过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
从 Unix 错误代码列表中read
:
#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)
答案1
E2BIG 不是错误之一read(2)
可能会回来。它看起来像是内核中的一个错误。
纯粹是猜测,但这可能是由于文件系统上的一些损坏以及 FAT 文件系统的 macOS 驱动程序在遇到损坏时返回该错误,最终导致read
.
无论如何,看起来你已经完成了调查。更进一步需要剖析文件系统和内核驱动程序代码。
您可以查看内核日志以查看是否有更多信息。您可以尝试在不同的操作系统上安装 FS。或者使用 GNUmtools
访问该 FAT 文件系统。
您还可以将该问题至少作为文档问题报告给 Apple(将 E2BIG 作为可能的错误代码之一,以及可能返回的条件)。
答案2
想出了如何解决这个问题。我mv
通过 macPorts 安装了 GNU 。这mv
能够将文件从 USB 驱动器移动到我的计算机,而不会返回 E2BIG 错误。我希望我能dtruss
编辑它,看看它是如何解决read
.
事实证明,文件指针略有损坏——因此,被复制的文件比它所在的位置早了 128KB。应该已经开始了,但文件的其余部分完好无损(当然,最后的 128KB 也被砍掉了。)
值得吸取的教训:Mac 上的本机 (BSD) 实用程序运行的算法与 GNU 对应的算法不同——因此,当其中一个失败时,请始终尝试另一个。