
Hallo, ich möchte alle Schrägstriche aus allen meinen Dateien entfernen, dies aber rekursiv für jedes Verzeichnis in einem Hauptverzeichnis tun.
Wie muss ich dieses Skript ändern, das nicht rekursiv arbeitet?
for f in "$1"/*; do
dir="$(dirname "$f")"
file="$(basename "$f")"
mv -- "$f" "${dir}/${file//[^_-0-9A-Za-z.]}"
done
oder besser, ich möchte nur einen Schrägstrich in Dateinamen ersetzen, dies aber für jeden Unterordner im Hauptordner?
Gruß Max
Antwort1
In der BSD-Schicht ist ein Schrägstrich das Pfadtrennzeichen. Wenn Sie auf einen Dateinamen mit einem Schrägstrich stoßen, übersetzt der Kernel den Schrägstrich- /
in einen Doppelpunkt- :
. Ein Dateiname in der Finder-Anwendung kann also so aussehen, foo/bar
in der BSD-Schicht sieht er jedoch so aus foo:bar
.
Um den Verzeichnisbaum zu durchsuchen, verwenden Sie , find
um Dateien mit :
im Namen zu suchen. Verwenden Sie dann ein Inline-Skript mit , -execdir
um die Doppelpunkte (Schrägstriche in der Finder-Anwendung) aus den Dateinamen zu entfernen.
find . -type f -name '*:*' -execdir bash -c ' for file
do
echo mv -- "${file}" "${file//:}"
done' sh {} \;
Dadurch werden nur der Befehl und die Operanden aufgelistet mv
. Wenn Sie der Meinung sind, dass die Ausgabe die gewünschten Ergebnisse liefert, entfernen Sie die echo
.