mv 单个文件的“参数列表太长”

mv 单个文件的“参数列表太长”

我试图通过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 对应的算法不同——因此,当其中一个失败时,请始终尝试另一个。

相关内容