
Чтобы переименовать каталоги, содержащие левые и правые квадраты, можно использовать:
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