Как я могу удалить начальные/конечные пробелы из имен файлов в Automator?

Моя жена все время утомительно переименовывает файлы при сохранении на резервном внешнем хранилище, поэтому я решил использовать автомат, чтобы сделать это за нее. Теперь у меня есть папка автоматизатора, куда она просто бросает туда файл, и он соответствующим образом переименовывает файл.

Теперь я столкнулся с ситуацией, когда файл теперь может содержать начальные и/или конечные пробелы, как я могу просто обрезать эти пробелы?

Я никогда не использовал AppleScript, но хорошо разбираюсь в написании сценариев оболочки. Могу ли я просто написать сценарий оболочки, который будет выполнять эту задачу? Я попробую AppleScript, если кто-то укажет мне правильное направление.

Просто напишите сценарий оболочки, который сделает это, как вы предложили, и в Automator вы можете запускать сценарии оболочки. В Automator найдите Run Shell Script.
Я также пытался удалить завершающие пробелы из файла superuser.com/questions/405127/…

Ответы (5)

for f in "$@"; do new="$(echo -n "$f" | sed -E 's|/$||;s| +$||;s|^ +||;s|/ +([^/]+$)|/\1|;s| +(\.[^.][a-zA-Z0-9.]*)$|\1|g')"; mv "$f" "$new"; echo "$new"; done

(Вставьте как действие «Выполнить сценарий оболочки» и выберите «Передать ввод: в качестве аргументов ».)

Интересно, мне нравится, как вы изменили имена переменных в моей, чтобы их было легче читать, а в своей вы поместили все в одно регулярное выражение. Одна вещь, которую вам, возможно, придется учитывать, заключается в том, что мы не хотим, чтобы пробелы удалялись из существующих путей, хотя они не должны быть там, что на самом деле может привести к сбою сценария Automator.
Ах, подождите, мой плохой, вы только захватить последний / в группе. Ладно, ты выиграл :)
Измените свое регулярное выражение на это. s|/$||;s| +$||;s|^ +||;s|/ +([^/]+$)|/\1|;s| *\. *([^\.]+)$|\.\1|;Мы можем разрешить использование других символов в расширении, и мы также не хотим, чтобы расширение начиналось с пробела.
s| *\. *([^.]+)$|\.\1|заменил бы EOL + . + LF.plistна EOL +.+ LF.plist. Это не повлияет some .tar.gz.
Пункт отмечен, хотя и ваше регулярное выражение. На самом деле, дополнительный символ точки выглядит ошибочным перед включением группы, поскольку он заменяет пробел точкой ( some .tar.gzстановится some..tar.gz). Удаление точки работает, но не препятствует появлению пробела в расширении в начале. Достаточно сказать, что это не имеет большого значения, эти вещи более тривиальны и могут подвергаться сомнению вечно.
@BrettRyan О, я исправил эту лишнюю ошибку с точкой.

Для этого есть однострочный скрипт, cd в эту папку и...

for f in *; do mv "$f" "$(echo $f)"; done

Поместите его в сценарий оболочки и вызовите из Applescript:

tell application "Terminal"
    do script "whatever"
end tell
Это работает только для имен файлов с 4 ведущими пробелами :-(
для f в *; сделать mv "$f" " echo $f | cut -b 1-"; сделано мужская стрижка
for f in *; do mv "$f" "$(echo $f)"; donecutто вообще не при чем .
Спасибо, ребята, но как это работает? Разве автомат не вызовет скрипт с аргументом файлов? Не for f in "$@"; do echo mv "$f" "$(echo $f)" ; doneбудет ли более подходящим?
@BrettRyan: *относится к каждому файлу (или каталогу) в pwd, поэтому нет необходимости в чем-то более сложном. Кроме того, когда вы делаете это, убедитесь, что вы не используете in, echoкак do echo mv "$f"в своем комментарии, иначе вы просто сделаете echoто, что хотите, а не сделаете это на самом деле.
@TuanAnhTran - вы можете упростить один лайнер как:for f in *; do mv "$f" $f; done
@frozenwithjoy: это не работает, если $f также содержит пробелы между ними, например, «foo bar».
@frozenwithjoy - Да, но если вы хотите, чтобы он действовал только на новые элементы, перемещенные в папку, а не на существующие, вам не следует использовать *. На самом деле правильный сценарий был бы таким, как я упомянул, но с дополнительным echoименем результирующего файла в стандарте, чтобы сохранить/разрешить любые другие действия в цепочке действий, без него ничего не будет вводиться в следующее действие.
Пожалуйста, посмотрите мой ответ, на чем я остановился

Для правильного ответа, основанного на ответе Туана, необходимо следующее, что не только переименует файл, но и сохранит цепочку действий для следующих действий.

Также обратите внимание, что мы не хотим никоим образом переименовывать родительскую папку, только файлы.

for f in "$@" ; do
    dirname=$(dirname "$f")
    basename=$(basename "$f")
    name=${basename%.*}
    ext=${basename##*.}
    name="$(echo "$name" | sed -Ee 's/^ +//;s/ +$//')"
    new="$dirname/$name.$ext"
    mv "$f" "$new"
    echo "$new"
done

Вам также не нужно помещать это в сам сценарий оболочки, автомат может встроить это в действие «Запустить сценарий оболочки».

Я также хотел удалить конечные пробелы из имен файлов и папок. Этот пост суперпользователя помог мне.

Есть AppleScript (очень похожий на Automator), который обрезает имена файлов. Он немного длинный, поэтому я не могу опубликовать его здесь, но вот ссылка на код. Убедитесь, что вы прочитали начальную часть кода, так как она объясняет, что делает скрипт и как он работает.

Посмотрел сценарий, теперь не знаю смеяться мне или плакать...