web-dev-qa-db-fra.com

Supprimer une partie du nom du fichier en utilisant for loop in terminal

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.

4
ashik992
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 
2
Agoston Horvath

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.

1
Roman Raguet