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

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

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

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

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

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

3 Solutions collect form web for “Почему эта команда Bash использует regex, не заменяя мои скобки?”

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

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

 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} 
  • Учитывая файл блочного устройства, как я могу перечислить все соответствующие разделы?
  • Скопируйте файлы, созданные сегодня, без команды FIND и SFTP на другой сервер
  • Сценарий оболочки для выполнения команды с итерацией
  • Вложенный цикл while работает не так, как ожидалось
  • Как запустить часть скрипта со сниженными привилегиями?
  • Как использовать тройник для захвата STDOUT из кодового блока в имя файла, определенное в блоке?
  • Список файлов другого формата при поиске определенного шаблона имени
  • Как фильтровать массив строк в ksh
  • Что такое команда eval в bash?
  • Разверните вывод двух команд `awk`
  • Как сделать паузу в сценарии оболочки?
  • Linux и Unix - лучшая ОС в мире.