web-dev-qa-db-de.com

Linux: Dateierweiterungen für mehrere Dateien entfernen

Ich habe viele Dateien mit der Erweiterung .txt. Wie entferne ich die .txt-Erweiterung für mehrere Dateien unter Linux?

Ich habe das gefunden

rename .old .new *.old

ersatz .old Erweiterung zum .new

Auch ich möchte dies für Dateien in Unterordnern tun.

43
rp101

rename ist etwas gefährlich, da nach seiner Manualpage :

beim Umbenennen werden die angegebenen Dateien umbenannt, indem das erste Vorkommen von ... ersetzt wird.

Mit Dateinamen wie c.txt.parser.y.

Hier ist eine Lösung mit find und bash:

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

Beachten Sie, dass dies fehlschlägt, wenn ein Dateiname eine neue Zeile enthält (selten, aber nicht unmöglich).

Wenn Sie GNU find haben, ist dies eine solidere Lösung:

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

Ich benutze das:

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

Die Perl-Version des Umbenennens kann eine Erweiterung wie folgt entfernen:

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

Dies kann mit find kombiniert werden, um auch Unterordner zu erstellen.

13
Andrew S

Sie können explizit eine leere Zeichenfolge als Argument übergeben.

rename .old '' *.old

Und mit Unterordnern, find . -type d -exec rename .old '' {}/*.old \;. {} Ist der Ersatz für den mit find gefundenen Eintrag, und \; Beendet die Auswahlliste für den nach -exec Angegebenen Befehl.

11
robert

Falls es hilft, so mache ich es mit zsh:

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

Das ${x%pattern} Konstrukt in zsh entfernt das kürzeste Vorkommen von pattern am Ende von $x. Hier wird es als Funktion abstrahiert:

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
}

Verwendung:

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

In Fish ist das möglich

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

Für Unterordner:

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

in bash linux ausführen

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