
공유 폴더 내의 디렉터리에 대한 절대 경로가 다음과 같은 SMB 버전을 실행하는 Linux OS에 문제가 있습니다.1024바이트보다 크고 파일 이름 구성 요소가 256바이트보다 큽니다.SMB 서비스가 충돌하고 SSH 및 FTP와 같은 네트워크 액세스를 위한 다른 모든 서비스가 시스템을 음소거로 렌더링하도록 잠급니다.
시스템 충돌을 방지하기 위해 문제 경로가 공유 폴더 외부에 있을 수 있다고 생각되는 폴더 그룹을 일시적으로 이동했습니다. 이 제한을 초과한 파일 및 파일 경로를 찾아서 이름을 바꾸거나 제거하여 대량의 파일을 공유 폴더로 반환해야 합니다.
나는찾다그리고grep성공하지 못한 채 명령을 내립니다. 문제가 되는 파일과 디렉터리를 찾아내는 데 사용할 수 있는 일련의 명령이나 스크립트가 있습니까?
조언해주세요.
답변1
이는 Bash로 작성되었으며 그에 특정한 기능을 사용합니다(그러나 유사한 기능은 다른 셸에서도 사용할 수 있습니다). 관심 있는 모든 파일 및 디렉터리에 공통된 상위 디렉터리에서 실행되도록 설계되었습니다. 여기에서 거기까지의 경로 길이를 고려하여 /
평가된 각 경로의 길이에 추가합니다. 그렇게 하고 싶지 않다면 lenpwd=0
대신에 를 사용하세요 lenpwd=${#PWD}
. 이름에 공백이 있는 파일이 있으면 작동하지만 개행 문자가 있는 파일은 작동하지 않습니다(어쨌든 추방되어야 함). 기준을 충족하는 모든 항목의 길이와 파일 사양을 인쇄합니다.
lenpwd=${#PWD}; find | while read -r path; do file=${path##*/}; if (( ${#path} + lenpwd > 1024 || ${#file} > 256 )); then echo "$((${#path} + lenpwd)) ${#file} $path"; fi; done
답변2
제가 이해한 것이 맞는지 모르겠지만 먼저 시도해 보세요.
for f in $( find /srv/smb -type f )
do
fname=$( basename "$f" )
pname=$( dirname "$f" )
l_fname=$( echo "$fname" | wc -c )
l_pname=$( echo "$pname" | wc -c )
if [ $l_fname -gt 256 ] ; then
# do somthing with $f when filename > 256b
rm -- "$f"
continue
fi
if [ $l_pname -gt 1024 ] ; then
# do something if path > 1024
echo "$f much too long!"
fi
done
이것은 단지 테스트를 하지 않았지만 bash-an-equlas-shell-script에서 작동해야 했던 것일 뿐입니다. 오류 검사 및 기타 유용한 기능을 자유롭게 추가하세요.
답변3
다음은 dirname 길이, basename 길이, dirname, 마지막으로 basename(후손을 위해)을 출력하는 한 줄짜리 코드입니다. 방금 현재 작업 디렉토리를 사용했지만 변경할 수 있습니다. 이것은 또한 주어진 것보다 더 큰 값을 끌어내기 위해 확장될 수도 있습니다.
find `pwd` -exec dirname '{}' \; -exec basename '{}' \;
| awk '( NR%2 != 0){printf("%s ",$0);next}1 '
| awk '{print length($1)" "length($2)" "$1$2}'
업데이트:
dirname 길이별로 정렬하려면 끝에 다음을 추가하십시오.
| sort -nr
기본 이름 길이별로 정렬하려면 끝에 다음을 추가하세요.
| sort -nr -k2
업데이트 2:
작성자의 의견에 따르면 공백이 +로 변경되어 개수와 함께 작동하게 됩니다.
find `pwd` -exec dirname '{}' \; -exec basename '{}' \;
| tr '[:blank:]' '+'
| awk '( NR%2 != 0){printf("%s ",$0);next}1 '
| awk '{print length($1)" "length($2)" "$1$2}'