Intereting Posts
Существуют ли какие-либо инструменты cli для рисования графики на экране во время X-сессии? SSH jumphost без учетных записей пользователей на jumphost Путаница в команде cp при создании нового каталога Более быстрая графика в гостевой гостевой системе KVM Скопируйте файлы в aws s3 bucket с помощью Ansible сортировка имен файлов численно, когда у них есть нечисловой префикс Заполнение поддельных каталогов avfs в zsh sshfs mount, sudo получает разрешение отказано корицы: получить оригинальный внешний вид, используя xsession Используйте rsync для сравнения удаленного каталога с локальным и сохраните различия в другом локальном каталоге Как отредактировать содержимое файла в vi? ssh между двумя ящиками linux – разрешение запрещено открытым ключом Как отключить звуки событий в Plasma 5? Какая файловая система для резервного копирования является лучшей? Как удалить сломанную установку glibc

Почему эта команда Bash использует regex, не заменяя мои скобки?

У меня есть эта команда, чтобы просмотреть все мои файлы в моем каталоге Music и всех подкаталогах и заменить квадратные скобки в имени файла закругленными скобками:

 find /home/Music/ -depth -name "* *" -execdir rename 's/\[/\(/g' "{}" \; 

Но это не сработает. Он не возвращает никаких ошибок, он просто не заменяет.

Я думал, что я сбежал из персонажей. Где я иду не так?

Кроме того, в конечном итоге я захочу заменить фигурные скобки {} с закругленными скобками () . Просто подумал, что я бы сказал, что теперь, если фигурные скобки появятся с еще большим количеством осложнений.

Единственная причина, по которой я могу понять, почему это не сработает, – это если в именах нет файлов с пробелами. Шаблон "* *" будет соответствовать только в том случае, если имя файла имеет пробел.

Если вы хотите найти файлы, чье имя содержит квадратные скобки, сделайте

 find /home/Music/ -depth -name "*[*" -execdir rename 's/\[/\(/g' "{}" \; 

В Linux реализованы две основные rename :

  • Тот, который поставляется с perl (который, вероятно, тот, который вы ожидали)
  • Тот, который поставляется с util-linux (возможно, тот, который у вас есть).

Синтаксис для того, который поставляется с util-linux будет следующим:

 find ... -execdir rename '[' '(' {} + 

Однако это заменит только одно появление [ .

rename perl можно назвать prename в вашей системе.

Альтернативой rename является zmv zsh. Сначала он позаботится о нисходящей глубине каталогов и избежит проблем с коллизиями.

В zsh:

 autoload zmv zmv '(**/)(* *)' '$1${2//\[/(}' 

И для преобразования как {} и [] в () :

 zmv -n '(**/)(* *)' '$1${${2//[]\}]/)}//[[{]/(}' 

Следующее должно работать:

 for i in `find o -type f`; do new="${i/\[/(}" ; if [ "${i}" != "${new}" ]; then mv ${i} ${new} ; echo "Moving ${i} to ${new}"; fi ; done 

Если имена файлов содержат пробелы, попробуйте выполнить следующее:

 OLDIFS=${IFS} ; IFS=$(echo -en "\n\b") ; for i in `find o -type f`; do new="${i/\[/(}" ; if [ "${i}" != "${new}" ]; then mv ${i} ${new} ; echo "Moving ${i} to ${new}"; fi ; done; IFS=${OLDIFS}