처음 두 자리가 16진수인 모든 파일을 삭제하려고 하므로 다음 식을 사용합니다.
ls | grep -Z '^[0-9a-f][0-9a-f]' | xargs -0 rm
그러나 터미널 출력 오류:
xargs: argument line too long
다시 확인하기 위해 다음을 실행했습니다.
ls | grep -Z '^[0-9a-f][0-9a-f]'
삭제하려는 모든 파일이 출력됩니다.
이 오류가 발생하는 이유는 무엇입니까? 또한 이 파일을 어떻게 삭제합니까?
또한 내 파일 이름은 다음과 같습니다.
ffc1abfa3149067e990620dbecfa96d325fbbd
ffcc72282168e33110ecf436e2726a5f901ca6
ffd010299a02ded0a8d41ee1ccc242f2193df2
ffd27295acbe3d35088a5a754f5593eac6a0ae
ffd332a39f7be05d58863fe3bf55d7aba68b69
ffd7ba85b0577b90c0fb1b3922303c486127d4
ffdb37718feaf64c404a6c2a3648f15cdf27b1
ffdbffe5b187c8a73d15da9e5f6cc0fb8d4df3
ffdd8c340650848759c7e59f90f8c112ac33ce
ffde57cb4ba9b69531a3b3f2c6588d2802f71b
ffdeb529353a85b642efa1404aa27e58982da1
ffe0bec99e3e64c61dd45e404c8ccf12d7bea5
ffe58837e9d976499781de17628f2f41e16c9a
ffee6887889924583762e43d5a6b9cd29b6690
fff0b6886aff6cb4073742fbf7bcc1b47d9b45
어쩌면 파일 이름 자체가 너무 길까요 xargs
?
답변1
-Z
grep -l
NUL로 출력하는 줄의 개행 문자를 변경하는 대신 을 사용하여 각 파일 이름 뒤에 NUL을 출력하는 것입니다 . 따라서 xargs -0
NUL 구분 기호가 없으므로 전달할 매개변수가 하나뿐이고 rm
매개변수의 최대 크기(Linux의 경우 128kB)보다 크기 때문에 거대한 레코드(여러 줄 바꿈 포함)만 볼 수 있습니다. 어쨌든 그렇지 않습니다. 라는 이름의 기록 파일이 없습니다 ...ffd7ba85b0577b90c0fb1b3922303c486127d4<newline>...fff0b6886aff6cb4073742fbf7bcc1b47d9b45
.
다음을 수행하세요.
rm [0-9a-f][0-9a-f]*
또는 목록이 너무 큰 경우:
printf '%s\0' [0-9a-f][0-9a-f]* | xargs -r0 rm
또는 다음을 사용하여 zsh
:
autoload zargs # best in ~/.zshrc
setopt extendedglob # ditto
zargs [0-9a-f](#c2)* -- rm
또는 다음을 사용하여 ksh93
:
command -x rm {2}([0-9a-f])*
또는:
find . ! -name . -prune -name '[0-9a-f][0-9a-f]*' -exec rm {} +
C가 아닌 로케일에서는 [a-f]
둘 이상이 일치할 수 있습니다 [abcdef]
.
답변2
선택한 명령을 다음으로 변경하는 것이 좋습니다.
find . -name '^[0-9a-f][0-9a-f]' -print0 | xargs -0 rm
아니면 다른 옵션
find . -name '^[0-9a-f][0-9a-f]' -exec rm {} \;
답변3
그냥 찾아 사용하는 것이 좋습니다. 비슷한 일이 find -type f -iname '[0-9a-f][0-9a-f]*' -delete
이루어져야합니다. 물론 먼저 -delete 대신 -print를 사용해 확인해 보세요.
답변4
파일 시스템 유형에 따라 파일 이름 제한이 발생할 수 있습니다. 바라보다:
http://en.m.wikipedia.org/wiki/Comparison_of_file_systems
특히 "제한사항" 섹션
파일 시스템 유형을 모르는 경우 다음 명령을 사용하여 확인할 수 있습니다.
$ cat /etc/fstab