Переименуйте файл из node1.html в node001.html - PullRequest
1 голос
/ 26 октября 2019

Мне нужно переименовать 99 бывших файлов: node1.html, node2.html ... в node001.html, node002.html ...

i=1
for file in $(ls | grep [1-99].html$)
do
                mv $file $(echo $file | sed 's/$file/${file}00${i}/g')
               i=$(( $i+1 ))   
done

Но, к сожалению, сообщает мне об ошибке:

move: node1.html и node1.html - это один файл

move: node2.html и node2.html - это один и тот же файл

...

  • В чем проблема?

Ответы [ 4 ]

0 голосов
/ 28 октября 2019

Попробуйте также использовать следующее расширение bash:

for i in {1..99}
do 
    if [ -f "node${i}.html" ] ; then 
       echo "mv node${i}.html node$(printf "%03d" ${i}).html"
       mv node${i}.html node$(printf "%03d" ${i}).html
    fi
done

Пример ( без фактической команды переименования )

mv node1.html node001.html
mv node2.html node002.html
mv node3.html node003.html
mv node4.html node004.html
mv node5.html node005.html
mv node6.html node006.html
...
...
...
mv node95.html node095.html
mv node96.html node096.html
mv node97.html node097.html
mv node98.html node098.html
mv node99.html node099.html
0 голосов
/ 26 октября 2019

Кроме цитирования (см. Комментарий выше), код не будет работать для двухзначных чисел (например, 15 станет file0015). Кроме того, существует проблема порядка, поскольку node2.html будет обрабатываться после node1.html, node11.html, ... node19.html

Кроме того, обратите внимание, что шаблон '[1-99] будетсоответствует только одной последовательности цифр.

Предполагается, что целью является сохранение чисел - просто переформатируйте в 3 цифры

for file in node[0-9].html *[0-9][0-9].html ; do
     f=${file%.html};
     prefix=${file%%[0-9]*}
     suffix=${f:${#prefix}}
     nn=$(printf '%03d' "$suffix") 
     mv "$file" "$prefix$nn.html"
done
0 голосов
/ 26 октября 2019

Первый тест с

for f in node[1-9][0-9].html node[1-9].html; do 
   sed 's/.*/"&" "&"/;s/[0-9]*.html.$/00&/' <<< "$f"
done 

Когда выбор файла и новые имена соответствуют ожидаемому, вы можете передать вывод в mv:

for f in node[1-9][0-9].html node[1-9].html; do
   sed 's/.*/"&" "&"/;s/[0-9]*.html.$/00&/' <<< "$f"
done | xargs -n2 mv
0 голосов
/ 26 октября 2019

Используйте двойные кавычки в команде sed для определения переменных. Также вы неправильно анализируете имя файла. Обратите внимание на команду cut, которую я добавил, чтобы ваше расширение не испортилось. Ваш сценарий будет выглядеть следующим образом.

i=1
for file in $(ls | grep [1-99].html$); do
  filename=$(echo ${file} | cut -d '.' -f1)
  mv ${file} $(echo "${filename}" | sed "s/${filename}/${filename}00${i}.html/g")
  i=$(($i+1))
done;
...