1

Я пытался написать сервис Mac Automator для удаления недопустимых символов из имен файлов. У меня это работает, но решение немного не элегантное, и мне было интересно, найдется ли у кого-нибудь лучшее решение.

Я запускаю следующий скрипт Bash, которому выбранный файл передан в качестве аргумента.

for f in "$@"
do

cd $(dirname "$f")
mv "${f##*/}" $(echo "${f##*/}" | sed -e 's/[^A-Za-z0-9._-]/_/g')

done

Это делает это

cd /Desktop/test/
mv some file %^& test.txt some_file_____test.txt

cd в каталог был единственным способом, которым я мог заставить работать mv . Он либо не сможет найти файл, либо переименует весь путь к файлу, т.е.

/Desktop/test/some file %^& test.txt to _Desktop_test_some_file_____test.txt

1 ответ1

0

Вы можете использовать dirname/basename, чтобы разделить вашу переменную $ f на $ fdir и $ fbase, и отредактировать только $ fbase, и остаться в стороне от dir, но на самом деле это выглядит не намного лучше, чем ваше решение для cd . .. (не думаю, что для удаления части косой черты в $ fbase требуется расширение параметра, поэтому становится немного меньше. Может даже быть в состоянии использовать замену шаблона вместо sed , но sed уже работает достаточно хорошо)

for f in "$@"
do
  fbase=$(basename "$f")
  fdir=$(dirname "$f")
  mv "${fdir}${fbase}" "${fdir}$(echo "${fbase}" | sed -e 's/[^A-Za-z0-9._-]/_/g')"
done

Но мне также интересно, может ли ваш for f in "$@" столкнуться с недопустимыми именами файлов, не отделяя $ f должным образом без каких-либо возни с IFS, но держу пари, что Automator позаботится об этом.

Другой вариант может состоять в том, чтобы запустить find а затем использовать его -exec или -execdir или даже xargs для поиска и переименования файлов, и есть программа rename которая может делать такие вещи, как «перевод заглавных букв в нижние, вы должны использовать« rename 'y/A-Z/a-z/' * но они могут не работать с Automator.

На самом деле, я попытаюсь провести быстрый тест, чтобы увидеть, что делает rename одиночку с именем файла с полными путями ... неожиданным "нет такого файла" при отображении правильного полного пути:

$ rename 'y/A-Z/a-z/' "/home/me/Downloads/NEWFILE-Z1.txt" 
Can't rename /home/me/Downloads/NEWFILE-Z1.txt /home/me/downloads/newfile-z1.txt: No such file or directory

Не похоже на большое улучшение по сравнению с mv, but переименование может сократить количество вложенных оболочек, труб и эха ...

$ rename -v 's/[^A-Za-z0-9._-]/_/g' New\ space\ file.txt 
New space file.txt renamed as New_space_file.txt

Я добавлю его в скрипт, меньше, но он вернется к cd , и " цитирование работает» вокруг вызова subshell:

for f in "$@"
do
  cd $(dirname "$f")
  rename 's/[^A-Za-z0-9._-]/_/g' "$(basename "$f")"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .