web-dev-qa-db-fra.com

Changer l'extension de plusieurs fichiers dans Ubuntu 12.04

Comme le titre le dit, comment puis-je changer l'extension de chaque fichier d'un répertoire dans Ubuntu? J'ai vu des exemples d'utilisation de renommer, etc., etc., mais j'obtiens une erreur (impossible de localiser le renommage du paquet) et elle n'est pas accessible via apt-get.

De plus, je ne connais pas vraiment le type de fichier d'origine! Ce sont des données qui ont été copiées du système de fichiers de Hadoop sur le lecteur local et j'ai besoin qu'elles soient toutes au format .txt.

Si cela fait une différence, j'utilise Ubuntu 12.04 dans Oracle Virtual Box.

Édition: Sortie de: ls -l/usr/bin/ renommer /etc/alternatives/renommer

amartin24@ubuntu-amartin24:~/TwitterMining/JSONTweets$ ls -l /usr/bin/*rename* /etc/alternatives/rename
ls: cannot access /etc/alternatives/rename: No such file or directory
-rwxr-xr-x 1 root root 10392 Mar 30  2012 /usr/bin/rename.ul
3
Andrew Martin

Vous pouvez cd dans le répertoire en question et exécuter quelque chose de similaire à ceci:

find -L . -type f -name "*.oldextension" -print0 | while IFS= read -r -d '' FNAME; do
    mv -- "$FNAME" "${FNAME%.oldextension}.newextension"
done

Ou si les fichiers n'ont aucune extension:

find -L . -type f -print0 | while IFS= read -r -d '' FNAME; do
    mv -- "$FNAME" "${FNAME%}.newextension"
done

Dans votre cas, vous devrez remplacer newextension par txt.

Quelqu'un de plus compétent avec bash pourrait peut-être mieux décomposer cela. N'hésitez pas à éditer ma réponse dans ce cas.


Description originale:

1) Il renommera uniquement l'extension de fichier (en raison de l'utilisation de ${FNAME%.so}.dylib). Toutes les autres solutions utilisant ${X/.so/.dylib} sont incorrectes car elles renomment à tort la première occurrence de .so dans le nom du fichier (par exemple, x.so.so est renommé en x.dylib.so ou, pire, ./libraries/libTemp.so-1.9.3/libTemp.so est renommé en ./libraries/libTemp.dylib-1.9.3/libTemp.so - une erreur).

2) Il gérera les espaces et tout autre caractère spécial dans les noms de fichiers (sauf les guillemets doubles).

3) Il ne changera pas de répertoires ni d’autres fichiers spéciaux.

4) Il suivra les liens symboliques dans les sous-répertoires et les liens vers les fichiers cibles et renommera le fichier cible, pas le lien lui-même (le comportement par défaut de find consiste à traiter le lien symbolique lui-même, pas le fichier pointé par le lien).

La source:

Extension de renommé Bash récursive - stackoverflow , répondu par aps2012 .

4
Glutanimate

La commande rename est déjà installée, vous n'avez rien d'autre à ajouter.

rename prend le code Perl comme premier argument. La plupart des cas concrets de changement de nom consistent en un remplacement d'expressions rationnelles: s/REGEXP/REPLACEMENT/. Pour supprimer l'extension existante, remplacez tout par le dernier caractère ..

rename 's/\.[^.]*$/.txt/' /path/to/directory/*

Si vos fichiers n’ont pas d’extension (pas de nom . dans leur nom), vous pouvez utiliser $ (qui correspond à la fin du nom du fichier) comme expression rationnelle ou ajouter .txt à la fin du fichier. Nom.

rename '$_ = "$_.txt"'  /path/to/directory/*

Cela ne change pas le contenu des fichiers, il les renomme seulement. Si vos données ne sont pas au format souhaité, il s'agit d'un problème totalement indépendant.

5
Gilles

Je pense que vous pouvez utiliser ce script bash simple

rename_ext_script.sh

#!/bin/bash
for file in *
do
  mv -- "${file}" "${file%.*}.txt"
done

ce script fonctionne pour les deux cas avec extension ou sans

2
lexeek

Solution graphique


Vue d'ensemble

Il existe un outil graphique très facile à utiliser et puissant dans le Centre logiciel Ubuntu pour renommer des lots de fichiers, pyRenamer.

Installation

Sudo apt-get install pyrenamer

ou

Foo
(source: buntu.com )

Captures d'écran

enter image description here

1
Kat Amsterdam

Si vous avez un tas de fichiers sans extension du tout (comme ./out_1, ./out_2, out_3, ...):

cd YOUR_DIRECTORY_HERE
ls | xargs -i{} mv {} {}.YOUR_EXTENSION_HERE

exemple

ls | xargs -i{} mv {} {}.md
0
Jamie

J'ai ce script. Je sais que ce n’est pas factice, à savoir lors du traitement de fichiers contenant des espaces. C'est pourquoi je lance la désintoxication au début.

#!/bin/bash
#   detox * 
# uncomment if you want to get rid of spaces and funny characters
    script=$(basename $0)
if  [ -z "$1" ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
    clear   
    echo "Script for adding an extension to files without extension"
    echo "---------------------------------------------------------"
    echo -e "\n Usage:"
    echo -e "   $script extension\n"
    echo -e "Exampli gratia: \n The command:"
    echo "      $script txt"
    echo -e "   will rename:\n      FileWithoutExtension -> FileWithoutExtension.txt\n"

else
for file in $(ls -p -I '*.*' | grep -v '/$') # excludes direcotires
    do 
    mv -iv "$file" "$file.$1"
    done
fi
0
xerostomus