Comando per troncare tutti i nomi di file a 255 caratteri
Domanda
Una directory NTFS è aperta in una shell bash. quale comando tronca ricorsivamente tutti i nomi di file in una directory al limite di 255 caratteri richiesto per ext3?
Soluzione
Se hai accesso a una shell di Windows, puoi usare:
@echo off
setlocal EnableDelayedExpansion
REM loop over all files in the cwd
for /f %%a in ('dir /a-d /b') do (
REM store this filename in a variable so we can do substringing
set ThisFileName=%%a
REM now take a substring
set ThisShortFileName=!ThisFileName:~0,255!
REM finally, the rename:
echo ren %%a !ThisShortFileName!
)
:EOF
endlocal
(Nota: ho aggiunto un'eco prima del comando rename solo per poter verificare visivamente che funzioni prima di eseguirlo. Funziona sulla mia scatola.)
Sono sicuro che qualcuno che si trova su una scatola * nix in questo momento potrebbe creare uno script simile per bash, ma sono bloccato nel mondo di Windows :)
Buona fortuna!
Altri suggerimenti
Supponendo che la shell si trovi nella directory NTFS in quanto è PWD:
per f in *; mv $ f $ {f: 0: 255}; done
Simile alla versione sed di Dave, ma evita un exec per file. Farà esplodere su una dir davvero enorme, a causa del limite massimo della riga di comando, e non subdir.
$ cat truncname
#!/bin/bash
# requires basename, dirname, and sed
mv $1 `dirname $1`/`basename $1 | sed 's/^\(.\{0,255\}\).*/\1/'`
$ chmod a+x truncname
$ find . -exec ./truncname {} \;