2017-10-05 1 views
2

Je veux conserver les fichiers mais supprimer leurs extensions. Les fichiers n'ont pas la même extension. Mon but final est de supprimer toutes leurs extensions et de les changer en une seule extension de mon choix. J'ai la deuxième partie vers le bas.En utilisant bash, comment puis-je supprimer les extensions de tous les fichiers dans un répertoire spécifique?

Mon code à ce jour:

#!/bin/bash 
echo -n "Enter the directory: " 
read path 
      #Remove all extensions 
find $path -type f -exec mv '{}' '{}'.extension \; #add desired extension 

Répondre

5

Vous n'avez pas besoin d'une commande externe find pour cela, mais le faire bash seul. Le script ci-dessous supprime l'extension de tous les fichiers du dossier path.

for file in "$path"/*; do 
    [ -f "$file" ] || continue 
    mv "$file" "${file%.*}" 
done 

La raison de l'utilisation [ -f "$file" ] est seulement pour un contrôle de sécurité. L'expression globale "$ path"/* peut ne pas figurer dans les fichiers listés, dans ce cas la commande mv échouera car il n'y a pas de fichiers. La condition [ -f "$file" ] || continue protège cela en quittant la boucle lorsque la variable $file est vide dans laquelle le [ -f "$file" ] renvoie un code d'erreur d'échec. Le || lorsqu'il est utilisé dans une instruction composée s'exécutera si la commande précédente échoue, alors lorsque continue est frappé, la boucle for est terminée.

Si vous souhaitez ajouter une nouvelle extension juste faire

mv "$file" "${file%.*}.extension" 
+0

Est-ce que "[-f" $ file "] || continuez "vérifiez si c'est un fichier? – Jaspreet

+0

@Jaspreet: Ceci est un modèle de glob pour lister tous les dossiers dans le dossier courant Vous voudrez peut-être lire [Bash - Glob Patterns] (http://mywiki.wooledge.org/BashGuide/Patterns) – Inian

+0

'pour le fichier dans *; do [-f" $ fichier "] && {echo" $ {file%. *} ";}; Done' - TEST le script avant de renommer tous vos fichiers :) – ropata

0

Vous pourriez vouloir essayer le ci-dessous. Il utilise trouver et awk avec le système() pour supprimer l'extension:

find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}' 

exemple:

[[email protected]:0 check]# ls -lrt 
total 0 
-rw-r--r--. 1 root root 0 Oct 5 13:49 abc.ext 
-rw-r--r--. 1 root root 0 Oct 5 13:49 something.gz 
[[email protected]:0 check]# find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS="."}{system("mv "$0" ./"$1"")}' 
[[email protected]:0 check]# ls -lrt 
total 0 
-rw-r--r--. 1 root root 0 Oct 5 13:49 abc 
-rw-r--r--. 1 root root 0 Oct 5 13:49 something 

aussi si vous avez une extension spécifique que vous souhaitez ajouter à tous les fichiers, vous pouvez modifier la commande comme ci-dessous:

find . -name "*" -type f|awk 'BEGIN{FS="/"}{print $2}'|awk 'BEGIN{FS=".";ext=".png"}{system("mv "$0" ./"$1ext"")}' 
1

Cela pourrait aussi être un moyen

for i in `find . -type f `;do filename=`ls $i | cut -f 2 -d "."`; mv $i ./$filename.ext; done