Dans le terminal utilisant for for, nous pouvons ajouter une partie avant ou après le nom du fichier. Mais si on veut l'enlever, comment fait-on cela? Par exemple, nous pouvons ajouter .old après le nom de tous les fichiers .txt en utilisant la commande ci-dessous
$for i in *.txt
>do
> mv $i $i.old
> done
Mais ma question est de savoir comment supprimer ce fichier .old en utilisant simplement la même technique.
for i in *.txt; do mv $i ${i%%.txt}; done
C'est simple pour cycle, tout comme celui que vous avez écrit. Notez que j'ai utilisé; au lieu de nouvelles lignes afin que je puisse le taper dans une seule ligne. La seule construction nouvelle pour vous est le $ {i %%. Txt}, qui signifie simplement $ i, avec tout ce qui suit les signes %% coupés de la fin de $ i.
Un bon conseil: si vous ne savez pas ce qui se passera, essayez d’ajouter echo devant la commande réelle, afin de voir les commandes exactes à exécuter. Par exemple.:
for i in *.txt; do echo mv $i ${i%%.txt}; done
Comme this web dit ... vous pouvez essayer bash Manipulations de chaînes
Vous pouvez utiliser deux "opérateurs" différents dans les paramètres (accolades), c’est-à-dire le # et le % opérateurs permettant de couper des motifs en début ou en fin de chaîne.
Votre cas pourrait être:
$ {variable% pattern} Couper la correspondance la plus courte à partir de la fin
Dans le terminal serait:
for i in *.old
do
mv $i ${i%\.*}
done
Ici vous avez des exemples:
Étant donné:
foo =/tmp/my.dir/filename.tar.gz
Nous pouvons utiliser ces expressions:
chemin = $ {foo%/*}
Pour obtenir: /tmp/my.dir (comme dirname)
fichier = $ {foo ## * /}
Pour obtenir: nomfichier.tar.gz (comme nom de base)
base = $ {fichier %%. *}
Pour obtenir: nom de fichier
ext = $ {fichier # *.}
Pour obtenir: tar.gz
$ {variable% pattern}
Couper le match le plus court de la fin
$ {variable ## motif}
Couper le plus long match depuis le début
$ {variable %% pattern}
Couper le plus long match de la fin
$ {variable # pattern}
Couper le match le plus court depuis le début
J'espère que ça aide.