Package Renommer des fichiers se terminant par le point

J'ai un grand serveur de fichiers unix avec une grande ressource SMB. Il sert des clients Mac, Linux et Windows. La plupart des fichiers de cette boîte ont été déplacés là-bas avec Mac Xserve. L'un des moyens de sauvegarder une ressource commune - à travers la boîte Windows. Ce logiciel de sauvegarde spécifique ne fonctionne pas s'il y a des caractères qui ne l'aiment pas dans les noms de fichiers.

J'ai réussi à corriger la plupart des problèmes avec les noms de fichiers, mais je lutterai avec des fichiers qui se terminent au point. Par exemple:


filename.


newfile.txt.


stupid old file.

J'essaie de trouver un moyen de lot renommer tous les fichiers se terminant avec le point, sur le même nom sans point. Alors

filename.

devient

filename

find . -name "*."

Fonctionne pour trouver des fichiers. J'ai essayé de passer à travers sed:

find . -name "*." | sed 's/.$//'

qui effectue son travail dans la console, mais ne renommera pas de fichiers. C'est la partie avec laquelle je lutte.
Invité:

Christine

Confirmation de:

Si vous avez une version du script Perl

rename

(appelé soit

rename

ou

prename

):

rename 's/\.$//' *.

ou version util-linux (appelé soit

rename

ou

rename-ul

):

 rename . '' *.

Si vous exécutez la commande sans arguments et obtenez quelque chose de similaire à:

Utilisation: Renommer [-v] [-n] [-f] perlexpr [Noms de fichiers]

Ensuite, ceci est une version du script. Perl.

Sorte de:

rename.ul: Pas assez d'arguments

Utilisant: rename.ul [Paramètres] Fichier de remplacement d'expression ...

Options: -v, --verbose, Expliquez ce qui est fait -V, --version

Afficher des informations sur la version et la sortie -h, --help Affichez cette aide et sortie

signifie cette version util-linux.

Dominique

Confirmation de:

Comme un pirate, mais devrait fonctionner:

Si vous souhaitez renommer à la fois des fichiers et des catalogues avec des points de terminaison:

    find . -name "*." -print0 | xargs -0 -n 1 my_rename.sh

Ou si vous souhaitez renommer uniquement les fichiers:

    find . -name "*." -type f -print0 | xargs -0 -n 1 my_rename.sh



my_rename.sh

Scénario simplement:

#!/bin/bash
mv "$1" "${1%%.}"

(N'oubliez pas non plus de rendre le script exécutable:

chmod +x my_rename.sh

) 2

Alice

Confirmation de:

On dirait qu'il devrait travailler:


find . -type f -name '*\.' -exec bash -c 'mv "$1" "${$1%.}"' _ {} \;

Il limite la recherche uniquement par des fichiers avec un point à la fin. (Sinon, il correspond au catalogue de travail actuel, '.'), Puis effectue un fragment cité de la coquille (

mv "$1" "${$1%.}"

) Pour chaque fichier trouvé. Dans le fragment de la coquille, il utilise l'expansion et le remplacement du paramètre bash Pour enlever le symbole final '.'. Un autre bruit de la rangée à la fin est nécessaire pour find -exec:

{}

Le texte de la coïncidence trouvée,

\;

nécessaire pour compléter la chaîne exec, Et je pense que

_

rapports exec Transférer à {} comme un paramètre (

$1

) à

sh

équipe. Honnêtement, il s'agit d'une utilisation spécifique. -exec Pour moi dans une nouveauté, je l'ai trouvé
https://askubuntu.com/question ... -line
.

Substitution du bit bash Assez simple, et je l'utilise souvent pour renommer des fichiers, par exemple

FILENAME=foo.JPG; mv ${FILENAME} ${FILENAME%.JPG}.jpg

Supprimer '.JPG' du nom du fichier et remplacez-le sur '.jpg'

Si vous voulez toujours utiliser sed, pas expansion bash, Il semble que cela fonctionnera:

find . -type f -name '*\.' -exec sh -c 'mv "{}" "$(echo {} | sed s/\.$// )"' \;

Au début, j'ai essayé de résoudre ce problème sans causer

-exec

appeler

sh -c

, Mais il n'aimait pas la divulgation {} En essayant d'effectuer sed (ou dans l'exemple précédent de substitution bash).

Notez également que vous devez mettre "" autour des noms de fichiers expansibles (par exemple, {} ou $ 1, Selon l'exemple), Comme il y a des espaces dans vos fichiers. Cela peut toujours ne pas fonctionner en fonction de laquelle les caractères spéciaux figurent dans votre fichier. (par exemple, "dans le nom de fichier" Appelle les problèmes).

Pour répondre aux questions, connectez-vous ou registre