web-dev-qa-db-fra.com

Linux: supprimer les extensions de fichier pour plusieurs fichiers

J'ai de nombreux fichiers avec l'extension .txt. Comment supprimer l'extension .txt pour plusieurs fichiers sous Linux?

Je l'ai trouvé

rename .old .new *.old

substituts .old extension à .new

Je veux également le faire pour les fichiers dans les sous-dossiers.

43
rp101

rename est légèrement dangereux, car selon son page de manuel :

renommer renommera les fichiers spécifiés en remplaçant la première occurrence de ...

Il fera heureusement la mauvaise chose avec des noms de fichiers comme c.txt.parser.y.

Voici une solution utilisant find et bash:

find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done

Gardez à l'esprit que cela se cassera si un nom de fichier contient une nouvelle ligne (rare, mais pas impossible).

Si vous avez GNU find, c'est une solution plus solide:

find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done
69
thkala

J'utilise ceci:

find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \;
20
Chris Cowan

La version Perl de renommer peut supprimer une extension comme suit:

rename 's/\.txt$//' *.txt

Cela pourrait être combiné avec find afin de faire également des sous-dossiers.

13
Andrew S

Vous pouvez explicitement passer une chaîne vide comme argument.

rename .old '' *.old

Et avec les sous-dossiers, find . -type d -exec rename .old '' {}/*.old \;. {} est le substitut de l'entrée trouvée avec find et \; termine l'arglist de la commande donnée après -exec.

11
robert

Au cas où cela aiderait, voici comment je le fais avec zsh:

for f in ./**/*.old; do
    mv "${f}" "${f%.old}"
done

Le ${x%pattern} la construction dans zsh supprime l'occurrence la plus courte de pattern à la fin de $x. Ici, il est résumé en fonction:

function chgext () {
    local srcext=".old"
    local dstext=""
    local dir="."

    [[ "$#" -ge 1 ]] && srcext="$1"
    [[ "$#" -gt 2 ]] && dstext="$2" dir="$3" || dir="${2:-.}"

    local bname=''
    for f in "${dir}"/**/*"${srcext}"; do
        bname="${f%${srcext}}"
        echo "${bname}{${srcext} → ${dstext}}"
        mv "${f}" "${bname}${dstext}"
    done
}

Usage:

chgext
chgext src
chgext src dir
chgext src dst dir

Where `src` is the extension to find (default: ".old")
      `dst` is the extension to replace with (default: "")
      `dir` is the directory to act on (default: ".")
3
svvac

Dans Fish, vous pouvez faire

for file in *.old
      touch (basename "$file" .old).new
end
1
Bruno Alano

Pour les sous-dossiers:

for i in `find myfolder -type d`; do
  rename .old .new $i/*.old
done
1
Konrad Garus

exécuter dans bash linux

for i in *;do mv ${i} ${i/%.pdf/} ;done
0
shahin aref