переименовать каталоги, содержащие левый/правый квадрат

переименовать каталоги, содержащие левый/правый квадрат

Чтобы переименовать каталоги, содержащие левые и правые квадраты, можно использовать:

shopt -s globstar 
rename -n 's/\(|\[|\]|\)//g' **

Это переименует все с помощью [ & ] из каталога, в котором вы находитесь, и рекурсивно.

но мне нужно выполнить это как скрипт nemo.action, и я не могу заставить его работать. (По сути обычный bash-скрипт)

Мой текущий сценарий:

#!/bin/bash
shopt -s globstar 

rename  "$@" 's/\(|\[|\]|\)//g' **

где$@/media/sf_Mediaserver3/Untitled Folder/[ hdjue] [kskk]

где[ hdjue] [kskk] (просто случайные буквы)это начальная папка, которую я хочу переименовать, и следующие файлы/папки...

Конечно, это не работает, и теперь мне нужно перейти в родительский каталог и выполнить первые строки, но это обработает ВСЕ каталоги в родительском каталоге, а не только... [ hdjue] [kskk] Кто-нибудь знает, как решить эту проблему?

похоже, что функция переименования не может справиться с начальным каталогом?

И, если возможно, удалите все пробелы (замените на . (точку)) и сделайте имя файла/каталога строчными буквами, чтобы упростить совместимость с внешними/внутренними запросами.

решение1

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

Трудность заключается в том, чтобы избежать переименования каталога, пока он все еще просматривается. Globstar **перечисляет элементы от корня вниз, а не в глубину, поэтому, учитывая пример, такой как a a/b a/b/c, переименование aбудет означать, что пути к a/bи a/b/cбольше не действительны. Опция findможет справиться с этим с помощью -depth, но это требует другого подхода

#!/bin/bash
#
find "$@" -depth -name '*[[\]]*' -print0 |
    while IFS= read -d '' -r item
    do
        path="${item%/*}" file="${item##*/}"    # Separate path and file name parts
        name="${file//[[\]]/}"                  # Generate new file name
        name="${name// /.}"                     # Comment: space becomes dot
        name="${name,,}"                        # Comment: lowercase name

        echo mv -f "$item" "$path/$name"        # Rename
    done

Удалите echo(или дополните) его, когда будете довольны тем, что скрипт выполняет то, что вы ожидаете.

Я использовал -print0в сочетании с -d ''опцией для readобработки файлов с действительно странными именами (включая те, что содержат символы новой строки и непечатаемые символы). Вы можете удалить оба, если хотите увидеть, что происходит, или если ваши реализации их не поддерживают, но тогда скрипт становится менее надежным

Модификаторы при назначении переменных path, fileи nameсопоставления с использованием globs (не регулярных выражений). Один модификатор ( %, #, /) означает самое короткое или одиночное сопоставление; двойной модификатор ( %%, ##, //) означает самое длинное сопоставление или несколько сопоставлений. Все это задокументировано на bashстранице руководства, но вот мое объяснение с контекстом:

  • ${item%/*}Указывает %на то, чтосамый короткийсоответствие шаблону глобуса должно быть удалено изконецзначения $item. Так что для a/b/cмы бы удалили текст, соответствующий /*оставивa/b
  • ${item##*/}Указывает ##на то, чтосамый длинныйсоответствие шаблону глобуса должно быть удалено изначалозначения $item. Так что для a/b/cмы бы удалили текст, соответствующий */оставивc
  • ${file//[[\]]/}Указывает //, чтонесколькозамены glob должны быть заменены текстом, следующим за следующим /, т.е. ничем. glob — это заключенный в квадратные скобки набор из двух символов [и ], означающий «либо, [либо ]». Так что для ab[cd]ef[ghмы бы в итоге получилиabcdefgh

Связанный контент