2013-02-27 1 views
0

Я пытаюсь удалить все "?" в именах файлов в заданном каталоге, у которых было больше подкаталогов, и у них есть подкаталоги внутри него. Я пробовал использовать простой скрипт regex perl с системными вызовами, но он не может перезаписывать каждый подкаталог, и переключение вручную будет слишком затратным временем. Как я могу решить свою проблему?Рекурсивно переименовывать каталоги и файлы на основе регулярного выражения

+0

Где этот код perl oO? Покажите нам ... –

+0

Он просто анализирует вывод «ls -R | grep»? », Regexes имена файлов и выдает системный вызов для их переименования. Это не работает очень хорошо, я обнаружил, что, используя как «найти», так и «переименовать», вы могли бы сделать эту работу очень легко, но я не мог понять, как обе они обезболивают документацию. –

ответ

1

Вы можете использовать команду для поиска имен файлов с помощью «?» а затем использовать аргумент exec для запуска скрипта, который удаляет «?» символов из имени файла. Рассмотрим этот сценарий, который вы могли бы сэкономить на /usr/local/bin/rename.sh, например (не забудьте дать ему + х разрешение):

#!/bin/sh 
mv "$1" "$(echo $1| tr -d '?')" 

Тогда это будет делать работу:

find -name "*\?*" -exec rename.sh {} \; 
+0

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

+0

Конечно! Я просто поместил ваш скрипт на случай, если вы все равно захотите его использовать, но с поиском, разрешающим рекурсию. Я попробую использовать переименование или что-то вместо этого ... – Claudio

+0

Является ли "?" расположенный где угодно в названии или всегда в конце или что-то еще? – Claudio

0

Попробуйте это:

find -name '*\?*' -exec prename 's/\?//g' {} + 

См https://metacpan.org/module/RMBARKER/File-Rename-0.06/rename.PL (это команда по умолчанию rename на дистрибутивах Ubuntu)

+0

Ваш ответ не работает. –

+0

Какая ваша ошибка? Вы видели мою ссылку? Если это «команда не найдена», вам следует рассмотреть возможность установки 'prename' –

+0

Ошибка (т.е. программа вернула 0). Он просто не «действует» (ничего не делать). –

0

Найдите все имена с помощью?? и удалить все из них. Вероятно, опция -exec также может быть использована, но для этого потребуется дополнительный скрипт

for f in $(find $dir -name "*?*" -a -type f) ; do 
    mv $f ${f/?/} 
done