2013-05-25 3 views
0

У меня есть скрипт для изменения имен файлов файлов mht, но он не проходит через dirs и sub dirs. Я задал вопрос на местном форуме, и я получил ответ, что это решение:Bash скрипт для изменения имен файлов рекурсивно

find . -type f -name "*.mhtml" -o -type f -name "*.mht" | xargs -I item sh -c '{ echo item; echo item | sed "s/[:?|]//g"; }' | xargs -n2 mv 

Но он генерирует ошибку. С некоторыми из моих экспериментов выясняется, что sh -c разбивает имена файлов с пробелом, и это порождает ошибку. Как я могу это исправить?

#!/bin/bash 
# renames.sh 
# basic file renamer 
for i in . *.mht 
do 
j=`echo $i | sed 's/|/ /g' | sed 's/:/ /g' | sed 's/?//g' | sed 's/"//g'` 
    mv "$i" "$j" 
    done 
+0

Что делать, если вы пробовали это: 'find. -type f \ (-name "* .mhtml" -o -name "* .mht" \) | xargs -I элемент sh -c '{echo \ "item \"; echo \ "item \" | sed "s/[:? |] // g"; } '| xargs -n2 mv' – lurker

+0

генерирует аналогичную ошибку – user2420889

ответ

2
#! /bin/bash 
find . -type f \(-name "*.mhtml" -o -name ".mht" \) -print0 | 
while IFS= read -r -d '' source; do 
    target="${source//[:?|]/}" 
    [ "X$source" != "X$target" ] && 
    mv -nv "$source" "$target" 
done 

Update: ли переименование согласно первоначальному вопросу, и добавлена ​​поддержка .mht.

+0

Он также не обрабатывает файлы .mht. – lurker

+0

Он ничего не делает, никакая ошибка не изменяет имя файла. – user2420889

1

Использование rename. С переименованием вы можете указать переименование:

find . -type f \(-name "*.mhtml" -o -name "*.mht" \) -print0 | xargs -0 -I'{}' rename 's/[:?|]//g' "{}" 

Таким образом, вы можете правильно обрабатывать имена с пробелами. xargs заменит {} на все имена файлов, предоставленные командой find. Также обратите внимание на использование -print0 и -0. Это использует \ 0 как разделитель, чтобы избежать проблем с именами файлов, содержащих \ n (новая строка).

-o не работает так, как планировалось. вы должны использовать скобки для условий группы.

Вы также можете рассмотреть использование -iname вместо -name, если вы имеете дело с файлом, заканчивающимся на «.mHtml».

+0

Lynch только ваше решение corct спасибо – user2420889

+0

@user Секрет в том, чтобы протестировать перед публикацией! Вы знаете, что можете принять мой ответ, если он решит вашу проблему. Принятие ответа помогает сообществу, иначе люди тратят время на ваш вопрос, чтобы понять, что уже существует действующее решение. – Lynch

Смежные вопросы