Was ist die beste Möglichkeit, Dateien und Verzeichnisse in der Bash rekursiv umzubenennen?

Was ist die beste Möglichkeit, Dateien und Verzeichnisse in der Bash rekursiv umzubenennen?

Ich versuche, ein Skript zu erstellen, mit dem ich viele Dateien und Verzeichnisse gleichzeitig umbenennen kann. Aber ich habe Probleme, es durch alle Dateien und Unterdateien zu bewegen.

Mein Skript im Moment ist das hier

#! /bin/bash

function _setname {
    for file in "$@"
    do
        oldname=$(basename "${file}")
        newname=$(echo "${oldname}" | tr '?%*:|' '_' )
        echo "${newname}"
        [ ! "${oldname}" = "${newname}" ] && mv "${oldname}" "${newname}"
    done
}
function _recursivename {
    for file in "$@"
    do
        currentpath="$(pwd)"
        cd "$(dirname ${file})"
        oldname="$(basename ${file})"
        newname="$(_setname ${oldname})"

        [ -d "${newname}" ] && _recursivename ./"${newname}"/*

        cd "${currentpath}"
    done
}
_recursivename "${@}"
exit

Es bricht ab, wenn es das Ende eines Verzeichnisbaums erreicht und wieder nach oben gehen muss, currentpathüberschrieben wurde und nicht zum Anfang zurückkehrt, um nach einem zweiten Unterverzeichnis zu suchen.

Ich verstehe nicht, warum currentpathes überschrieben wird oder wie man es richtig macht.

BEARBEITEN: Musste es nur deklarieren local, ich dachte, es würde als lokal deklariert, indem es innerhalb einer Funktion definiert wird.

Antwort1

In einer Funktion verwendete Variablen sind global. Mit anderen Worten: Wenn einer Variablen innerhalb einer Funktion ein Wert zugewiesen wird, kann der Aufrufer auf diesen Wert zugreifen. Wenn Sie eine Variable deklarieren möchten, die nur innerhalb der Funktion verwendet wird und nicht für den Aufrufer zugänglich sein soll, sollte diese Variable deklariert werden local. Sie können beispielsweise die folgende zusätzliche Zeile an den Anfang Ihrer Funktion setzen _recursivename:

local currentpath

Dies ist insbesondere für rekursive Funktionen wichtig, die private Kopien ihrer lokalen Variablen benötigen und bei jedem Aufruf eindeutige Werte behalten müssen, wie in Ihrem Fall.

verwandte Informationen