Benennen Sie Dateien in mehreren Verzeichnissen basierend auf teilweisen Verzeichnisnamen um

Benennen Sie Dateien in mehreren Verzeichnissen basierend auf teilweisen Verzeichnisnamen um

Ich habe an einem Ort viele Verzeichnisse mit Dateien verschiedener Erweiterungen darin. Die Verzeichnisse folgen einer Standardkonvention, die darin enthaltenen Dateien jedoch nicht. Die Lösung, die ich zu finden versuche, besteht darin, die Dateien in jedem Ordner basierend auf einem Teil des Verzeichnisses umzubenennen, in dem sie sich befinden, für die Liste der Ordner, die ich durchgehen muss.

Zum Beispiel:

Verzeichnis: 001234@Redsox#17

file1.pdf
file7A.doc
spreadsheet.xls

Ausgabe:

[email protected]
[email protected]
[email protected]

Gehen Sie bei jedem Verzeichnis vor und benennen Sie nur den angehängten Code im Verzeichnisnamen um. Ich habe bereits ein grundlegendes Framework für die Durchführung des Prozesses, bin mir aber nicht sicher, wie ich den Teil des Verzeichnisses, den ich brauche, am besten greife

for directory in *; do 
    pushd "$directory"
    index=1
    for filename in *; do
        target_filename="${directory}$????${filename}"
        mv "$filename" "${target_filename}"
        ((index++))
   done
  popd
done

Antwort1

Ich würde so etwas machen:

# nullglob
#    If set, Bash allows filename patterns which match no files to
# expand to a null string, rather than themselves.
shopt -s nullglob

# instead of looping through the dirs, loop through the files
# add al the possible extensions in the list
$ for f in */*.{doc,pdf,xls,txt}; do 
  # get the file dirname
  d=$(dirname "$f")
                  # using parameter expansion get the part
                  # of the dirname you need
  echo mv -- "$f" "$d/${d%%@*}@$(basename "$f")"

  # when you are satisfied with the result, remove the `echo`
done
$ ls -1 001234@Redsox#17/
[email protected]
[email protected]
[email protected]

verwandte Informationen