mv 단일 파일에 대한 "매개변수 목록이 너무 깁니다"

mv 단일 파일에 대한 "매개변수 목록이 너무 깁니다"

mv g* dir7개 파일 세트를 를 통해 내 컴퓨터로 이동 하려고 합니다 . 명령줄은 파일 중 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를 설치해 볼 수 있습니다. 또는 GNU를 사용하여 mtools해당 FAT 파일 시스템에 액세스합니다.

최소한 문서 문제(가능한 오류 코드 중 하나로 E2BIG 및 가능한 반환 조건 포함)로서 문제를 Apple에 보고할 수도 있습니다.

답변2

이 문제를 해결하는 방법을 알아냈습니다. macPorts를 통해 GNU를 설치 했습니다 mv. mvE2BIG 오류를 반환하지 않고 USB 드라이브에서 내 컴퓨터로 파일을 이동할 수 있었습니다 . 나는 dtruss그것을 편집하고 그것이 어떻게 해결되는지 볼 수 있었으면 좋겠다 read.

파일 포인터가 약간 손상된 것으로 나타났습니다. 따라서 복사되는 파일은 원래 위치보다 128KB 이전이었습니다.~해야 한다시작되었지만 파일의 나머지 부분은 그대로 유지됩니다. (물론 마지막 128KB도 잘렸습니다.)

교훈: Mac의 기본(BSD) 유틸리티는 GNU와 다른 알고리즘을 실행하므로 하나가 실패하면 항상 다른 것을 시도하십시오.

관련 정보