Добавление 0 к однозначному числу в именах файлов

Честно говоря, использование принятого ответа привело к большому количеству пропущенных кадров.

Тем не менее, использование комплекса фильтров hstack_дало идеально плавный выходной сигнал:

ffmpeg -i left.mp4 -i right.mp4 -filter_complex hstack output.mp4

1
15.12.2019, 05:52
4 ответа

Это то, что вы ищете.

В основном необходимо сделать следующее:

1, проверьте, является ли цифра одинарной или двойной -. Если это одна цифра и значение меньше или равно 9, переименуйте файл. Что должно быть так же просто, как:

(( someDigit <= 9 )) && [[ ${#someDigit'slength} -lt 2 ]]

2, так как там будут файлы с буквами, мы можем хранить их как:

digit=$( echo $file | cut -d '-' -f1 | grep ch | awk '{print $2}' );

3, затем отфильтруйте цифру, чтобы мы могли сравнить ее для первого варианта. Добавьте дополнительные фильтры, которые, по вашему мнению, могут быть необходимы в опции tr -dследующим образом:

digitOnly=$( echo $digit | tr -d [a-Z] );  

4, затем запустите цикл в том каталоге, где вы собираетесь переименовывать файлы. Реализация всего этого будет выглядеть следующим образом:

for file in *file.txt; do
  digit=$( echo $file | cut -d '-' -f1 | grep ch | awk '{print $2}' );
  digitOnly=$( echo $digit | tr -d [a-Z] );
  if (( digitOnly <= 9 )) && [[ ${#digitOnly} -lt 2 ]]; then
    # mv "${file}" "ch 0${digit} - file.txt"
    echo "'${file}' is renamed to 'ch 0${digit} - file.txt'";
  fi
done

Удалите #из mv после того, как вы будете удовлетворены перед реальным выполнением. На вашем примере:

touch 'ch 10 - file.txt' 'ch 2 - file.txt' 'ch 3 - file.txt' 'ch 4a - file.txt' 'ch 5 - file.txt'

Затем выполнение скрипта или копирование и вставка вышеуказанного scriptв bashдаст вам следующий результат:

'ch 2 - file.txt' is renamed to 'ch 02 - file.txt'
'ch 3 - file.txt' is renamed to 'ch 03 - file.txt'
'ch 4a - file.txt' is renamed to 'ch 04a - file.txt'
'ch 5 - file.txt' is renamed to 'ch 05 - file.txt'

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

0
27.01.2020, 23:40

Сzsh:

autoload zmv # best in.zshrc
zmv -n '*[0-9]*' '${f//(#m)<->/${(l:2::0:)MATCH}}'

(удалить-n(сухой -запустить )если устраивает ).

Будет ли lслева -дополнять все числа до ширины 2.

Остерегайтесь, что усекает числа до ширины 2 (изменит 1234-2.txtна34-02.txt).

Не уверен, что вы имеете в виду под встроенной , особенно по отношению к Linux , которая является просто ядром. autoload— это встроенная в zsh -, но обратите внимание, что автозагружаемая функция zmvвызывает утилиту mv, которая по умолчанию не является встроенной (, но ее можно сделать с помощьюzmodload zsh/files).

0
27.01.2020, 23:40

Шаблон

'ch '[1-9][!0-9]*'- file.txt'

будет соответствовать всем именам файлов, которые необходимо изменить (из тех, которые вы указали ), то есть любому имени файла, которое начинается с ch , за которым следует цифра от 1 до 9, за которой следует что-то, что не является цифра. После этого мы допускаем любые символы, а имена должны заканчиваться на - file.txt.

Мы можем перебрать эти файлы с помощью

for name in 'ch '[1-9][!0-9]*'- file.txt'; do
   ...
done

Теперь необходимо вставить 0после бита ch . Это можно сделать, удалив подстроку ch и заменив ее наch 0:

for name in 'ch '[1-9][!0-9]*'- file.txt'; do
    newname='ch 0'${name#ch }
done

Подстановка параметра ${name#ch }расширится до 2 - file.txt, если $nameсодержит ch 2 - file.txt(, префиксch )будет удален.

После этого вы можете просто переименовать файл:

for name in 'ch '[1-9][!0-9]*'- file.txt'; do
    newname='ch 0'${name#ch }

    printf 'would rename "%s" into "%s"\n' "$name" "$newname"
    # mv -i "$name" "$newname"
done

Удалите #в строке с закомментированной командой mvпосле однократного запуска цикла, чтобы убедиться, что он работает правильно.

Приведенный выше цикл, учитывая имена файлов, которые вы показываете, будет выводить

would rename "ch 2 - file.txt" into "ch 02 - file.txt"
would rename "ch 3 - file.txt" into "ch 03 - file.txt"
would rename "ch 4a - file.txt" into "ch 04a - file.txt"
would rename "ch 5 - file.txt" into "ch 05 - file.txt"
1
27.01.2020, 23:40

С rename/prename(renameЛари Уолла в Debian/Ubuntu,prenameв RedHat/Fedora):

rename -n 's/^ch (\d) /ch 0$1 /' *

-nдля пробных прогонов, удалите (или замените на `-v' )для фактического выполнения.

1
27.01.2020, 23:40

Теги

Похожие вопросы