Проблема с Mac заключается в том, что он позволяет использовать пробел в конце файла или папки. Если этот файл или папка с пробелом в конце копируется на FTP с помощью Filezilla или Dropbox, тогда Mac создает папки с «Foldername_WhiteSpaceConflict». Чтобы избавиться от этой проблемы, все файлы и папки с пробелом необходимо переименовать без пробела. Какое решение может быть лучшим с использованием терминала или какой-либо программы?
Вот скрипт для поиска и удаления конечного пробела из файлов и каталогов:
#!/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
Джеймс Гаррис
bmike