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]