Как удалить символ пробела (пробел) в конце имен файлов и имен папок?

Проблема с Mac заключается в том, что он позволяет использовать пробел в конце файла или папки. Если этот файл или папка с пробелом в конце копируется на FTP с помощью Filezilla или Dropbox, тогда Mac создает папки с «Foldername_WhiteSpaceConflict». Чтобы избавиться от этой проблемы, все файлы и папки с пробелом необходимо переименовать без пробела. Какое решение может быть лучшим с использованием терминала или какой-либо программы?

Automator может быть полезен, если вы не программист.
Для тех, кто не хочет использовать командную строку — используйте этот publicspace.net/ABetterFinderRename/index.html .

Ответы (5)

Вот скрипт для поиска и удаления конечного пробела из файлов и каталогов:

#!/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
Что произойдет, если у вас есть файл, оканчивающийся на пробел, в каталоге, оканчивающемся на пробел - не будет ли файл иметь неправильное имя после переименования каталога?
Хорошо, обновил мой ответ :)
Здесь важна позиция -d, также я добавил проверку для предотвращения mvперезаписи существующих файлов.

Пришлось еще немного поправить скрипт. Для файлов или папок, оканчивающихся на букву «t», эта буква также будет удалена. И вызов, чтобы проверить, существует ли файл, не работал должным образом, поэтому изменил «target_name» на $ target_name, и теперь он работает.

#!/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
Это отлично сработало для меня! Спасибо!

Существует приложение для Mac под названием « Name Mangler », оно сделает все, что вы могли бы сделать с именем файла/папки, и вы даже можете создать свой собственный код и использовать его в приложении. Существует бесплатная пробная версия, которая дает вам 4 неограниченных попытки, и вы можете вернуть имена обратно, если допустили ошибку.

Что-то вроде этого должно работать:

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

Это удалит конечные пробелы из каждого файла/каталога в pwd.

Ответ Devin Stagner 2016 работает отлично, но я обновил его 20 августа 2022 года, потому что он -dустарел (сейчас -depthиспользуется), а также этот переключатель должен идти после .искомого пути ( ). Добавлено [ ]закрытие $file и $target_name при отображении информации через команду echo, чтобы было более очевидно, что было удалено из имени файла.

#!/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