Commande pour tronquer tous les noms de fichiers à 255 caractères
Question
Un répertoire NTFS est ouvert dans un shell bash. quelle commande tronquera de manière récursive tous les noms de fichiers d’un répertoire jusqu’à la limite de 255 caractères requise pour ext3?
La solution
Si vous avez accès à un shell Windows, vous pouvez utiliser:
@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
(Remarque: j'ai ajouté un écho avant la commande de changement de nom afin que vous puissiez vérifier visuellement qu'il fonctionne avant de l'exécuter. Fonctionne dans ma boîte.)
Je suis sûr que quelqu'un qui se trouve actuellement sur une boîte * nix pourrait créer un script similaire pour bash, mais je suis bloqué dans le monde Windows:)
Bonne chance!
Autres conseils
En supposant que le shell se trouve dans le répertoire NTFS en tant que PWD:
pour f dans *; do mv $ f $ {f: 0: 255}; terminé
Similaire à la version sed de Dave, mais évite un exec par fichier. Explose sur un très gros répertoire, à cause de la limite de ligne de commande maximale, et ne fait pas de sous-répertoires.
$ 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 {} \;