Wie entferne ich Dateierweiterungen auf dem Mac mithilfe von csh oder bash?

892
Yaqian Huang

Ich habe fälschlicherweise die .dcmErweiterung für alle Dateien auf meinem Mac hinzugefügt, was dazu geführt hat, dass die Anmeldung bei meiner iCloud und die Speicherung meiner Schlüsselketten fehlgeschlagen sind.

Ich war so verzweifelt bemüht, eine Lösung zu finden, um die ursprünglichen Dateierweiterungen wiederherzustellen, aber ich habe nur Antworten gefunden, die .abcdurch .defErweiterungen ersetzt werden sollen, was ich nicht möchte. Ich möchte alle redundanten .dcmErweiterungen entfernen, die in jeder Datei hinzugefügt wurden.

Gibt es eine Möglichkeit, die .dcm-Erweiterung für alle Dateien zu löschen (rekursiv)?

Dies sind die Lösungen zum Ersetzen von Dateierweiterungen, die ich gefunden habe:

for file in *.abc; do mv "$file" "$"; done for old in *.abc; do mv $old basename $old .abc.ef; done 

Sie sind entweder nicht rekursiv oder Bash (3.2x) sagt "schlechte Ersetzung" / "Befehl nicht gefunden".

3
Ich bin neugierig, welche Antworten Sie gefunden haben, um zu erklären, wie etwas ersetzt werden soll, aber bei dem Sie die Erweiterung nicht einfach löschen können? slhck vor 7 Jahren 1
mehrere ... Da es sich bei diesen Fragen darum handelt, wie eine Dateierweiterung durch eine andere ersetzt wird, z. B. .abc bis .def, lauten die Antworten wie "für eine Datei in * .abc; do mv" $ file "" $ .def "; fertig Yaqian Huang vor 7 Jahren 0
Ist Ihnen der Gedanke gekommen, das `.def` einfach aus den gefundenen Beispielen zu entfernen? Bash ersetzt hier nichts. Es löscht `.abc` und fügt` .def` hinzu. Sie hätten also einfach den Teil "add` .def "weglassen können. slhck vor 7 Jahren 1
Ja und Bash sagt schlechte Substitution Yaqian Huang vor 7 Jahren 0
und das ist auch nicht rekursiv Yaqian Huang vor 7 Jahren 0
Ich habe andere wie alte in * .txt gefunden; do mv $ old `basename $ old .txt`.md; erledigt. Löschen von md hat auch nicht funktioniert .. Yaqian Huang vor 7 Jahren 0
Ich bezweifle, dass der Code, den Sie gezeigt haben, einen Fehler "schlechter Ersatz" darstellt. Es ist zwar nicht rekursiv, aber das könnte leicht geändert werden. Es wäre hilfreich, wenn Sie, wenn Sie eine Frage stellen, explizit alles, was Sie versucht haben, hinzufügen und erklären, warum es nicht funktioniert hat. Sie können Ihren Beitrag trotzdem noch [bearbeiten] - Kommentare sind für solche Dinge nicht besonders nützlich. slhck vor 7 Jahren 0

1 Antwort auf die Frage

4
slhck

Das sollte es tun:

find / -type f -name '*.dcm' -exec sh -c 'mv -- "$0" "$"' {} \; 

Der Befehl:

  • Rekursionen von /
  • Findet jede Datei mit dem Namen *.dcm
  • Führt einen kleinen Subshell-Aufruf mit einem Argument aus, dem Dateinamen ( {}).
  • … Mit welcher die Datei ( $0) umbenannt wirdmv
  • das kürzeste match ( %) der .dcmString-Manipulation löschen

Setzen Sie ein echovor, um mvzu sehen, was es tun würde.

Wenn Sie ohne Subshell arbeiten möchten, können Sie Folgendes per Pipe an while:

find / -type f -name '*.dcm' -print0 | while IFS= read -r -d '' filename; do mv -- "$filename" "$" done 
Danke vielmals! Ich werde ein bisschen mehr damit spielen. Und ich habe gerade eine andere funktionierende Lösung gefunden: find / path / to / your / files -name '* .dcm' | während gelesen fname; mv "$ fname" "$ " fertig Yaqian Huang vor 7 Jahren 0
Das ist auch gut, aber nicht so robust. In meiner Antwort finden Sie eine bessere Lösung, die alle möglichen Leerzeichen in Dateinamen behandelt. (Bash ist komisch, aber erforderlich: https://unix.stackexchange.com/questions/9496/looping-through-files-mit-spaces-in-the-names) slhck vor 7 Jahren 0
Es gibt eine Zeile während der Ausführung: `override r -------- Apple / staff für /Users/Apple/Library/Keychains/.fl0D1D1BA9? (j / n [n]) `Ich verstehe den Inhalt nicht. Schätze ich sollte [n] treffen? Yaqian Huang vor 7 Jahren 0
Ja, und das mit "Echo" funktioniert super! Yaqian Huang vor 7 Jahren 0