1

У меня большой список файлов во многих папках. Некоторые файлы вызывают проблемы, поэтому мне нужно переименовать скобки во что-то еще.

Я пытаюсь использовать эти команды, чтобы найти любые и все файлы с "(" или ")".

Очевидно, это не сработает:

find . -name *(*

Мне нужно экранировать символ "(":

find . -name *\(*

или же

find . -name '*\(*'

или же

find . -name "*\(*"

Ни одно из вышеперечисленного не работает.

В конце я хочу, чтобы сработало следующее:

`find . -name '*.*' -prune -o -exec rename 's/\*/(*$/\OOOO/i' {} +`  

Выше следует переименовать любой символ "(" в 0000 (например, Документ (июль).xls изменится на Document0000July).xls)

затем

find . -name '*.*' -prune -o -exec rename 's/\*/)*$/\1111/i' {} +

это должно переименовать любой символ ")" в 1111 (например, Document0000July).xls изменится на Document0000July1111.xls)

есть идеи?

Спасибо

1 ответ1

2

простое и довольно переносимое решение (но оно может подавить особые случаи с именами файлов ... более надежное решение может быть найдено, если у вас есть последняя версия GNU xargs и вы найдете):

find . \( -name '*(*' -o -name '*)*' \) -print > ze_list
while read a_line ; do 
   echo mv "$a_line" "$(echo "$a_line" | sed -e 's/(/0000/g' -e 's/)/1111/g')" ; 
done < ze_list

Тогда, если вы уверены, что это будет делать то, что вы хотите, уберите «эхо»

(не волнуйтесь, поскольку оболочка скрывает окружающие кавычки (") при использовании echo, но они будут там, чтобы гарантировать, что" mv "получит только 2 аргумента, источник и назначение.)

"$(....| ....) "это где замена появляется. Окружающие кавычки важны, так что получающееся имя, даже если оно содержит пробелы, все равно будет считаться одним (1) аргументом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .