Автоматически генерировать имя файла с помощью bash

предположим, у меня есть такие файлы:

out-1.avi

Я хочу иметь кусок кода bash, который даст мне следующее имя файла для такого списка:

out-1.avi
out-2.avi
out-3.avi
etc.

Edit то, что мне нужно достичь, чтобы получить следующее имя файла для сценария записи веб-камеры, так что не ovewrite!

5
задан thekiwi5000
источник

5 ответов

Я не знаю контекста, но следующий цикл содержит все элементы, вам понадобится:-

n=0; while (($n < 10)); do ((++n)); echo name=out-$n.avi; done

Это список первых 10 файлов в вашей последовательности.

после вашего редактирования, я вижу несколько ответов.

простая модификация моего оригинального цикла будет: -

n=1; while [ -f out-$n.avi ]; do ((++n)); done; echo name=out-$n.avi

это будет хорошо работать для нескольких файлов, но становится все более неэффективным, поскольку количество файлов монтируется в сотни.

более эффективный ответ можно было бы сохранить последний номер файла в отдельном файле:-

n=`line<avicount.text`; ((++n)); echo "$n">avicount.text; echo name=out-$n.avi

этот скрипт будет генерировать новое имя при каждом вызове, но полагается на avicount.text всегда в синхронизации с используемыми файлами и именами.

лучшим решением было бы использовать метку времени вместо порядкового номера: -

echo name=out-`date +%Y%M%d%H%m%S`.avi

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

4
отвечен AFH 2014-12-02 00:26:09
источник
#!/bin/bash
LAST=$(find . -maxdepth 1 -name "*.avi" -type f -printf "%p\n" | sed -e s/.\/out-//g -e s/.avi//g | sort -g | tail -1)
touch out-$(($LAST + 1)).avi
  • первая строка выбирает последний измененный файл avi в каталоге (не рекурсивный) и извлекает номер в его имени.
  • вторая строка добавьте 1 к предыдущему имени и сгенерируйте файл.
1
отвечен jherran 2014-12-02 07:40:02
источник

можно использовать seq для генерации значений, затем touch создать файлы.

for n in $(seq 1 5)
do
    touch out-${n}.avi
done
0
отвечен suspectus 2014-12-01 22:26:22
источник

предполагая, что у вас не так много файлов в каталоге видео (в этом случае такой подход не очень эффективен), этот простой мир кода может помочь:

MAX=1000;
PREFIX="out-"
SUFFIX=".avi"

for i in `seq 1 $MAX` ; do
    file="${PREFIX}${i}${SUFFIX}"

    if [ ! -e $file ] ; then
        break;
    fi
done

# this is the next available file name
echo $file

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

0
отвечен Jindra Helcl 2014-12-02 00:40:20
источник

решение @jherran поставленный, вероятно, должен встретить вас. Если вы просто хотите скрипт дать вы следующее имя файла, а не создавать его для вас, изменить "сенсорный" на "эхо" в конце своего сценария.

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

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

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

#!/usr/bin/sh

if [ -f counter.txt ]; then
{
   VAL=`cat counter.txt`
   echo "out-$VAL.avi"
   VAL=`expr $VAL + 1`
   echo "$VAL" > counter.txt
   exit 0
}
fi
echo "out-1.avi"
echo "2" > counter.txt
exit 0

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

 date +%F-%T

или любой степени детализации дат и времен вы считаете полезным. Выше будет дать вам что-то вроде этого:

2014-12-01-16:41:33

шлепнуть ".avi " на конце, и у вас есть временные метки имен файлов, вплоть до второго.

0
отвечен JesseM 2014-12-02 00:53:20
источник

Другие вопросы bash file-management linux