2013-12-05 3 views
2

У меня есть сценарий, который переименовывает html-файлы на основе информации в их тегах. Этот скрипт проходит через текущий каталог и все подкаталоги и рекурсивно выполняет это переименование. однако, переименовав их, он перемещает их в текущий рабочий каталог, из которого я запускаю свой сценарий оболочки. Как я могу убедиться, что файлы остаются в своих подкаталогах и не перемещаются в рабочий каталог?Переименование файлов, но сохранение их в их нынешнем подкаталоге

Вот что я работаю с:

#!/usr/bin/env bash 
for f in `find . -type f | grep \.htm` 
    do 
    title=$(awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f") 
    mv ./"$f" "${title//[ ]/-}".htm 
done 

ответ

1

Try:

mv ./"$f" "$(dirname "$f")/${title//[ ]/-}".htm 

Обратите внимание, что ваш for f in \ найти ...»потерпит неудачу на любое имя файла с пробелом или CR в нем , Вы можете избежать этого с линией, как:

find . -type f -name '*.htm' -type f -exec myrename.sh {} \; 

где код переименования в скрипте под названием myrename.sh.

1
shopt -s globstar nullglob 
for f in **/*.htm 
do 
    title=$(awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} {print $2}' "$f") 
    mv "$f" "$(dirname "$f")/${title//[ ]/-}".htm 
done 
2

Никогда не используйте эту конструкцию:

for f in `find . -type f | grep \.htm` 

как цикл не выполняется для имен файлов, которые содержат пространства, так и Grep ненужным, как находка имеет -name вариант для этого. Используйте вместо этого:

find . -type f -name '*\.htm.*' -print | 
while IFS= read -r f 

Это:

awk 'BEGIN{IGNORECASE=1;FS="<title>|</title>";RS=EOF} 

может быть уменьшена и разъяснена:

awk 'BEGIN{IGNORECASE=1;FS="</?title>";RS=""} 

Обратите внимание, что использование EOF вводит в заблуждение, как EOF только неопределенная переменная, поэтому содержит пустую строку (поэтому ваша первая запись будет идти до первой пустой строки, а не до конца файла). Вы могли бы использовать RS=bubba и получить тот же эффект, но просто установить RS на пустую строку яснее. Не говорите, что это то, что вам ДОЛЖНО делать, но это более четкая реализация того, что вы делаете.

Наконец положить все это вместе что-то, как это должно работать для вас:

find . -type f -name '*\.htm.*' -print | 
while IFS= read -r f 
do 
    title=$(awk 'BEGIN{IGNORECASE=1;FS="</?title>";RS=""} {print $2}' "$f" 
    mv -- "$f" $(dirname "$f")/"${title//[ ]/-}".htm 
done 
Смежные вопросы