Encontrar la longitud de los files y la ruta del file de la estructura de directorys en un sistema de files Linux

Tengo un problema en un sistema operativo Linux que ejecuta una versión de SMB donde si la ruta absoluta a un directory dentro de una carpeta compartida es mayor de 1024 bytes y el componente de nombre de file es mayor de 256 bytes el service SMB se bloquea y bloquea todos los otros services para acceso de networking como, SSH y FTP que hacen que la máquina se silencie.

Para evitar que el sistema se bloquee, he movido temporalmente un grupo de carpetas donde creo que la ruta del problema puede estar ubicada fuera de la carpeta compartida. Necesito encontrar el file y la trayectoria del file que excedieron esta limitación y renombrarlos o quitarlos permitiéndome devolver un bulto de los files a la carpeta compartida.

He intentado los commands find y grep sin éxito. ¿Hay una cadena de commands o script que puedo usar para search los files y el directory ofensivo?

Por favor avise.

Esto se escribe en Bash y utiliza características específicas para él (pero características similares están disponibles en otros shells). Está diseñado para ejecutarse desde un directory padre común a todos los files y directorys que le interesan. Toma en count la longitud de la ruta desde / hacia allí y la añade a la longitud de cada ruta evaluada. Si no quieres hacerlo, usa lenpwd=0 lugar de lenpwd=${#PWD} . Funcionará si hay files con espacios en sus nombres, pero no aquellos que tienen líneas nuevas (que deben ser desterradas de cualquier manera). Imprime las longitudes y filespec de cualquier cosa que encuentra que cumplen los criterios.

 lenpwd=${#PWD}; find | while read -r path; do file=${path##*/}; if (( ${#path} + lenpwd > 1024 || ${#file} > 256 )); then echo "$((${#path} + lenpwd)) ${#file} $path"; fi; done 

No sé si entiendo que es correcto, pero primero bash:

 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 

Esto es sólo un script i-didnt-test-it-pero-que-debería-funcionar-en-bash-an-equlas-shell. Siéntase libre de agregar comprobación de errores y otras cosas útiles …

He aquí un one-liner que da salida a la longitud del nombre dirname, luego la longitud del nombre base, luego el nombre dirname y el último nombre basename (para la posteridad). Acabo de usar el directory de trabajo actual, pero esto se puede cambiar. Esto también se puede ampliar para sortear los valores más grandes que sus datos.

 find `pwd` -exec dirname '{}' \; -exec basename '{}' \; | awk '( NR%2 != 0){printf("%s ",$0);next}1 ' | awk '{print length($1)" "length($2)" "$1$2}' 

Actualizar:

Para orderar por longitud de nombre de dirname, agregue esto al final:

  | sort -nr 

Para orderar por longitud de nombre base, agregue esto al final:

  | sort -nr -k2 

Actualización 2:

Según el comentario del autor, esto cambiará el espacio en blanco a + 's, lo cual hará que funcione con los conteos.

 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}'