Wie entferne ich Leerzeichen (Whitespace) vom Ende von Dateinamen und Ordnernamen?

Das Problem mit Mac ist, dass es Leerzeichen am Ende der Datei oder des Ordners zulässt. Wenn diese Datei oder dieser Ordner mit Leerzeichen am Ende mit Filezilla oder Dropbox auf FTP kopiert wird, erstellt der Mac Ordner mit "Foldername_WhiteSpaceConflict". Um dieses Problem zu beseitigen, müssen alle Dateien und Ordner mit Leerzeichen ohne Leerzeichen umbenannt werden. Welche Lösung könnte die beste sein, wenn Sie ein Terminal oder ein Programm verwenden?

Automator könnte nützlich sein, wenn Sie kein Programmierer sind.
Für diejenigen, die die Befehlszeile nicht verwenden möchten, verwenden Sie diese publicspace.net/ABetterFinderRename/index.html

Antworten (5)

Hier ist das Skript zum Suchen und Entfernen von nachgestellten Leerzeichen aus Dateien und Verzeichnissen:

#!/bin/bash                                                                                                                                                                                                        

IFS=$'\n'
for file in $(find -d . -name "* ")
do
  target_name=$(echo "$file" | sed 's/[ \t]*$//')
  if [ "$file" != "$target_name" ]; then
      if [ -e "$target_name" ]; then
          echo "WARNING: $target_name already exists, file not renamed"
      else
          echo "Move $file to $target_name"
          mv "$file" "$target_name"
      fi
  fi
done
Was passiert, wenn Sie eine Datei haben, die mit Leerzeichen in einem Verzeichnis endet, das mit Leerzeichen endet? Hat die Datei nicht einen falschen Namen, nachdem das Verzeichnis umbenannt wurde?
Gut, meine Antwort aktualisiert :)
Die Position von -dist hier wichtig, außerdem habe ich ein Häkchen hinzugefügt, um zu verhindern, mvdass vorhandene Dateien überschrieben werden.

Ich musste das Skript noch etwas korrigieren. Bei Dateien oder Ordnern, die mit dem Buchstaben „t“ enden, würde dieser Buchstabe ebenfalls gelöscht. Und der Aufruf zum Überprüfen, ob die Datei existiert, funktionierte nicht richtig, also wurde "target_name" in $target_name geändert und es funktioniert jetzt.

#!/bin/bash                                                                                                                                                                                                        

IFS=$'\n'
for file in $(find -d . -name "* ")
do
  target_name=$(echo "$file" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  if [ "$file" != "$target_name" ]; then
      if [ -e $target_name ]; then
          echo "WARNING: $target_name already exists, file not renamed"
      else
          echo "Move $file to $target_name"
          mv "$file" "$target_name"
      fi
  fi
done
Das hat bei mir perfekt funktioniert! Danke!

Es gibt eine Anwendung für Mac namens „ Name Mangler “, die alles tut, was Sie mit einem Datei-/Ordnernamen machen können, und Sie können sogar Ihren eigenen Code erstellen und ihn in der App verwenden. Es gibt eine kostenlose Testversion, die Ihnen 4 unbegrenzte Versuche gibt, und Sie können die Namen zurücksetzen, wenn Sie einen Fehler machen.

So etwas sollte funktionieren:

ruby -e "Dir.glob('* ').each { |name| File.rename name, name.chomp(' ') }"

Dadurch werden nachgestellte Leerzeichen aus jeder Datei/jedem Verzeichnis im pwd entfernt.

Die Antwort von Devin Stagner 2016 funktioniert einwandfrei, aber ich habe sie am 20.08.2022 aktualisiert, da sie -dveraltet ist (jetzt verwendet wird), und dieser Schalter muss auch nach dem gesuchten -depthPfad ( ) gehen . .Hinzugefügt , um $file und $target_name[ ] einzuschließen , wenn die Informationen über den echo-Befehl angezeigt werden, damit deutlicher wird, was aus dem Dateinamen entfernt wurde.

#!/bin/bash

IFS=$'\n'
for file in $(find . -depth -name "* ")
do
  target_name=$(echo "$file" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  if [ "$file" != "$target_name" ]; then
      if [ -e $target_name ]; then
          echo "WARNING: [$target_name] already exists, file not renamed"
      else
          echo "Move [$file] to [$target_name]"
          mv "$file" "$target_name"
      fi
  fi
done