web-dev-qa-db-fra.com

Suppression des deux points dans le nom du répertoire

Actuellement, le répertoire créé automatiquement pour un programme avec lequel je travaille comprend des deux points (:), ce qui crée des problèmes lorsque je tente de manipuler le répertoire. Quelqu'un pourrait-il m'aider d'abord à supprimer ce signe deux-points, puis à pouvoir cd dans le répertoire renommé? (Donc je suppose que je devrais égaler le nouveau nom du répertoire en une variable?)

Exemple:

  • nom du répertoire actuel: Lang-32b-Branch:Line
  • nom de répertoire souhaité: Lang-32b-BranchLine
7
Biscuit

Pour y parvenir manuellement, vous pouvez utiliser la commande mv de manière simple, avec des guillemets puissants pour vous assurer que le shell n'interprète pas les deux points comme un caractère spécial:

mv 'Lang-32b-Branch:Line' 'Lang-32b-BranchLine' && cd 'Lang-32b-BranchLine'

Une autre approche consiste à utiliser une variable et l'une des fonctionnalités de développement du paramètre Bash, ce qui peut s'avérer plus utile si vous souhaitez automatiser ce changement de nom de répertoire dans un script:

dir=Lang-32b-Branch:Line
mv "$dir" "${dir//:/}"

Le développement de "${dir//:/}" remplacera toute occurrence du caractère deux-points par rien, donnant le résultat attendu de Lang-32b-BranchLine. Utiliser "${dir/:/}" n'entraînera que la suppression de la première occurrence du colon, bien que cela fonctionne toujours pour votre exemple donné.

En tant que one-liner à déplacer et cd dans le répertoire:

dir=Lang-32b-Branch:Line ; mv "$dir" "${dir//:/}" && cd "${dir//:/}"

Ou si vous souhaitez capturer le nom du répertoire modifié dans une variable nommée new_dir:

dir=Lang-32b-Branch:Line ; new_dir="${dir//:/}"; mv "$dir" "$new_dir" && cd "$new_dir"

Un excellent guide pour l'expansion des paramètres Bash est disponible ici .

12
Arronical

Si vous souhaitez qu'une commande générale renomme plusieurs fichiers et/ou répertoires avec un ou plusieurs deux points, vous pouvez utiliser renamename__,

rename 's/://g' *

Après cela, vous pouvez cddans l’un des répertoires (que vous avez modifiés) comme d’habitude (sans guillemets).


Ligne de commande alternative en fonction des conseils donnés dans les commentaires de @DavidFoerster et @dessert,

rename 's/://g' *\:*/
  • Si vous souhaitez limiter les actions de changement de nom aux répertoires, vous devez ajouter une barre oblique après l'étoile générique.
  • Vous pouvez également insérer deux points dans l'expression générique pour limiter la sélection des fichiers à ceux contenant le nom deux points, ce qui pourrait accélérer l'action si un nombre important de répertoires devaient être recherchés,

Modifier:

@EliahKagan suggère de commencer par un "parcours d'essai" avec l'option -n,

rename -n 's/://g' *

qui affiche simplement quelles opérations de changement de nom seraient effectuées. Ensuite, il peut être exécuté à nouveau avec l'option -n supprimée pour renommer les fichiers. Cela permet d'éviter des erreurs telles que le renommage accidentel d'un groupe de fichiers que l'on voulait réellement laisser seul.

8
sudodus

S'il ne s'agit que du seul répertoire, vous pouvez utiliser mv et cd. Pour utiliser la puissance de bash History Expansion et le paramètre spécial $_:

mv Lang-32b-Branch:Line !#:$:s/:/ && cd $_

!#:$:s/:/ est remplacé par le dernier mot ($) de la ligne de commande actuelle (!#), où le premier : est s et n'est pas remplacé par rien. Si vous souhaitez supprimer tous les deux-points , remplacez-le par !#:$:gs/:/ (globally). $_ est simplement remplacé par le dernier argument de la dernière commande.

4
dessert