Intereting Posts

Как найти / заменить символы в имени папки?

Я хочу выполнить следующие операции:

  • Найти / заменить (используя regexp) все вхождения :"\|? И заменить его пустой строкой
  • Найти / заменить (используя regexp) все вхождения ^\.+|\.+$ И заменить его пустой строкой

В качестве теста я вручную создал 2 папки (см. Скриншот) и запустил эти:

 find "/home/users/Downloads/test" -regextype sed -regex "*:\|?*" -type d find "/Users/chiyo/Downloads/test" -regextype sed -regex "*[:\|?]*" -type d find "/Users/chiyo/Downloads/test" -regextype sed -regex "[:\|?]" -type d 

и не нашел ни одного.

Я использую эту версию find .

 => find --version find (GNU findutils) 4.6.0 Copyright (C) 2015 Free Software Foundation, Inc. 

Есть идеи, как это можно сделать?

скриншот с каталогами

Первые два примера являются выходом.

  • *<>:\|?* Вы не можете начать с * . * означает 0 или более из предыдущего атома. Там также написано < сопровождается > а затем : … и ? это особый характер.
  • *[<>:\|?]* Это ближе к тому, что вы используете class символов, но все равно * в начале.
  • [<>:\|?] Это совпадет, если это совпадение с под-регулярным выражением, но это не так. Вы должны соответствовать всему имени файла, включая путь к каталогу.

Поэтому добавьте коды регулярных выражений, чтобы потреблять вещи до и после. ( . - любой символ, * - ноль или более гарантий предыдущего атома. Поэтому .* будет соответствовать чему угодно.)

Поэтому попробуйте .*[<>:\|?].*

Вы не собираетесь заменять что-либо подобное, и вы не сказали нам, чем вы хотите их заменить.

Используйте -name вместо -regex (так как это имена файлов, которые вас на самом деле интересуют, а -regex сопоставляет весь путь):

 find folder -type d -name '*[<>:\|?]*' 

Это позволит найти любой каталог в folder или под ней, имя которой содержит хотя бы один из символов < , > , : , \ , | или ? ,

Чтобы удалить эти символы из имен каталогов:

 find folder -depth -type d -name '*[<>:\|?]*' \ -execdir bash -c 'mv "$1" "${1//[<>:\|?]/}"' bash {} ';' 

Это предполагает, что новое имя переименованного каталога уже не является именем существующего каталога. Добавление теста для столкновения имен:

 find folder -depth -type d -name '*[<>:\|?]*' \ -execdir bash -c '[ ! -e "${1//[<>:\|?]/}" ] && mv "$1" "${1//[<>:\|?]/}"' bash {} ';' 

Это позволит избежать попыток переименовать каталог, если новое имя уже существует

Команда mv выполняется в дочерней оболочке bash . Оболочка выполняется с родительским каталогом найденного каталога в качестве рабочего каталога. Он использует специфическую для bash подстановку параметров, чтобы удалить все оскорбительные символы из имен файлов найденных каталогов.

Команда также использует -depth чтобы выполнить глубинный обход структуры каталогов в folder . Без этого find попытается ввести каталоги, которые вы только что переименовали, и потерпит неудачу.

Связанные с:

  • Понимание опции -exec `find`