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. P>
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! P>
7 Réponses :
find . -name '*.bx' -type f | while read NAME ; do mv "${NAME}" "${NAME%.bx}" ; done
"$ {nom}" "$ {nom% .bx}" code> 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é
En supposant que vous êtes dans le dossier de l'endroit où vous souhaitez faire ce
Erreur de syntaxe à (Eval 1) Ligne 1, proche "". Xargs: Renommer: Extrait avec Statut 255; avortement
find -name "*.bx" -print0 | xargs -0 rename 's/\.bx//'
Ne fonctionne pas pour moi (aucun effet). La version de renommée code> 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.
bash 4+
pour bla in * .bx; faire mv $ {blah} $ {blah %%. bx} code> p>
Voici une autre version qui procède aux éléments suivants:
old_ext code> variable (défini maintenant sur .bx code>) dans et ci-dessous cwd code>, les stocke dans $ Fichiers CODE> LI>
- 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
Extra: Comment supprimer toute extension des noms de fichiers 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
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 code> (notez le
. code> après
trouver code>).
J'ai oublié de mentionner, en cours d'exécution sur la solution d'OS X. Tylerl fonctionne bien.