Моя жена все время утомительно переименовывает файлы при сохранении на резервном внешнем хранилище, поэтому я решил использовать автомат, чтобы сделать это за нее. Теперь у меня есть папка автоматизатора, куда она просто бросает туда файл, и он соответствующим образом переименовывает файл.
Теперь я столкнулся с ситуацией, когда файл теперь может содержать начальные и/или конечные пробелы, как я могу просто обрезать эти пробелы?
Я никогда не использовал AppleScript, но хорошо разбираюсь в написании сценариев оболочки. Могу ли я просто написать сценарий оболочки, который будет выполнять эту задачу? Я попробую AppleScript, если кто-то укажет мне правильное направление.
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
(Вставьте как действие «Выполнить сценарий оболочки» и выберите «Передать ввод: в качестве аргументов ».)
s|/$||;s| +$||;s|^ +||;s|/ +([^/]+$)|/\1|;s| *\. *([^\.]+)$|\.\1|;
Мы можем разрешить использование других символов в расширении, и мы также не хотим, чтобы расширение начиналось с пробела.s| *\. *([^.]+)$|\.\1|
заменил бы EOL + . + LF.plist
на EOL +.+ LF.plist
. Это не повлияет some .tar.gz
.some .tar.gz
становится some..tar.gz
). Удаление точки работает, но не препятствует появлению пробела в расширении в начале. Достаточно сказать, что это не имеет большого значения, эти вещи более тривиальны и могут подвергаться сомнению вечно.Для этого есть однострочный скрипт, cd в эту папку и...
for f in *; do mv "$f" "$(echo $f)"; done
Поместите его в сценарий оболочки и вызовите из Applescript:
tell application "Terminal"
do script "whatever"
end tell
echo $f | cut -b 1-
"; сделано мужская стрижкаfor f in *; do mv "$f" "$(echo $f)"; done
cut
то вообще
не при чем .for f in "$@"; do echo mv "$f" "$(echo $f)" ; done
будет ли более подходящим?*
относится к каждому файлу (или каталогу) в pwd
, поэтому нет необходимости в чем-то более сложном. Кроме того, когда вы делаете это, убедитесь, что вы не используете in, echo
как do echo mv "$f"
в своем комментарии, иначе вы просто сделаете echo
то, что хотите, а не сделаете это на самом деле.for f in *; do mv "$f" $f; done
*
. На самом деле правильный сценарий был бы таким, как я упомянул, но с дополнительным 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), который обрезает имена файлов. Он немного длинный, поэтому я не могу опубликовать его здесь, но вот ссылка на код. Убедитесь, что вы прочитали начальную часть кода, так как она объясняет, что делает скрипт и как он работает.
Касым Дорсель
Джо Дж.