9
votes

Comment supprimer une extension spécifique des fichiers de manière récursive à l'aide d'un script Bash

J'essaie de trouver un script Bash qui recherchera récursivement des fichiers avec une extension .bx et supprimer cette extension. Les noms de fichiers ne sont pas un format particulier (certains sont des fichiers cachés avec "." Prefix, certains ont des espaces dans le nom, etc.), et tous les fichiers n'ont pas cette extension.

Je ne sais pas comment trouver chaque fichier avec l'extension .bx (dans et ci-dessous mon CWD) et supprimez-la. Merci pour l'aide!


1 commentaires

J'ai oublié de mentionner, en cours d'exécution sur la solution d'OS X. Tylerl fonctionne bien.


7 Réponses :


22
votes
find . -name '*.bx' -type f | while read NAME ; do mv "${NAME}" "${NAME%.bx}" ; done

2 commentaires

"$ {nom}" "$ {nom% .bx}" est meilleur. Les noms de fichier peuvent contenir des espaces!


C'est parfait, merci. Après avoir regardé autour de vous, je pense que vous pouvez également le faire à l'aide de Regex à Trouver, c'est-à-dire. -Type f -regex '. * \. BX $' | tout en lisant je; faire mv "$ i" "$ {i %%. bx}"; terminé



1
votes

En supposant que vous êtes dans le dossier de l'endroit où vous souhaitez faire ce xxx


1 commentaires

Erreur de syntaxe à (Eval 1) Ligne 1, proche "". Xargs: Renommer: Extrait avec Statut 255; avortement



2
votes
find -name "*.bx" -print0 | xargs -0 rename 's/\.bx//'

3 commentaires

Ne fonctionne pas pour moi (aucun effet). La version de renommée expédiée sur Linux (Centos 5.5) ne prend pas en charge les expressions régulières. Voir la réponse de Raghuram pour une solution de travail.


Semble dépendre de la version alors - l'homme renommé me donne "Perl V5.10.1" (sur Ubuntu 10.04.1)


Désolé, aurait dû mentionner que je suis sur OS X, qui malheureusement n'expédie pas de renommer. Votre solution semble bonne pour les utilisateurs de Linux.



2
votes

bash 4+ xxx


0 commentaires

1
votes

pour bla in * .bx; faire mv $ {blah} $ {blah %%. bx}


0 commentaires

1
votes

Voici une autre version qui procède aux éléments suivants:

  1. trouve des fichiers basés sur old_ext code> variable (défini maintenant sur .bx code>) dans et ci-dessous cwd code>, les stocke dans $ Fichiers CODE> LI>
  2. remplace l'extension des fichiers à rien (ou quelque chose de nouveau en fonction de $ new_ext code> variable, actuellement défini sur .xyz code>) li>) ol>

    Le script utilise dirname code> et BasEname code> pour rechercher respectivement le chemin de fichier et le nom de fichier. p>

    #!/bin/bash
    
    old_ext=".bx"
    new_ext=".xyz"
    
    files=$(find ./ -name "*${old_ext}")
    
    for file in $files
    do
        file_name=$(basename $file $old_ext)
        file_path=$(dirname $file)
        new_file=${file_path}/${file_name}${new_ext}
    
        #echo "$file --> $new_file"
        mv "$file"    "$new_file"
    done
    


0 commentaires

1
votes

Extra: Comment supprimer toute extension des noms de fichiers xxx pré>

coupera à partir du dernier point, c'est-à-dire pet.cat.dog ---> pet.cat p>

find -maxdepth 1 -type f | sed 's/.\///g'| grep -E [.] | while read file; do mv $file ${file%%.*}; done


1 commentaires

Sur Mac OS X, vous devez apparemment spécifier l'annuaire de départ explicitement: trouver. -MaxDepth 1 -Type F | sed 's /.\/// g' | grep -e [.] | pendant que le fichier lu; faire mv $ dollar $ {fichier% *}; fait (notez le . après trouver ).