Linux 파일 시스템에서 파일 길이 및 디렉토리 구조의 파일 경로 찾기

Linux 파일 시스템에서 파일 길이 및 디렉토리 구조의 파일 경로 찾기

공유 폴더 내의 디렉터리에 대한 절대 경로가 다음과 같은 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}'

관련 정보