Como eu digo ao mkdir para tentar criar o dir1, e se ele já existir crie o dir2, etc, até que ele atinja um nome que não existe?

13

Eu quero criar um diretório com um número no final, e.x. "dir1", e incremente esse número se o diretório já existir até que ele atinja um nome de diretório que não existe, e eu preciso fazer isso em uma única linha em uma linha de comando do Linux, algo como:

mkdir --increment dir$

Como eu faria isso?

Até agora eu tenho isso:

dir=output; n=0; mkdir -p $dir$n; if test -d $dir$n; then n=$((n+1)); echo $dir$n; fi

Mas apenas ecoa o nome do próximo dir, eu preciso executar recursivamente o comando.

    
por 01AutoMonkey 02.03.2014 / 17:11

5 respostas

26

Este é um exercício trivial no uso de while :

n=0
while ! mkdir dir$n
do
    n=$((n+1))
done

Mas é claro que não é preciso pensar muito para perceber que esse mecanismo trivial não se adapta bem.

Então, em vez de reinventar a roda e ter que raspar todos os cantos novamente, criamos diretórios temporários exclusivos de um modelo de maneira um pouco diferente:

name=$(mktemp -d dirXXXXXXXXXXX)
    
por 02.03.2014 / 17:50
5

encontre o "maior" primeiro nome, obtenha o número e incremente:

last_dir=(printf "%s\n" dir* | sort -Vr | head -1)
num=$(last_dir#dir)
mkdir "dir$((num+1))"
    
por 02.03.2014 / 21:19
4

Se você quiser criar incrementalmente diretórios listados na ordem correta, posso recomendar pastas nomeadas com base na data atual?

DATE=$(date +%F)
mkdir "dir-$DATE"

Ele criará diretórios com os nomes como dir-2014-03-02 ( YYYY-MM-DD , para aparecer em ordem alfabética).

Se você criar mais de um diretório por dia, poderá adicionar o horário atual ao nome do arquivo. Veja man date sobre como ajustar a formatação de saída de date .

    
por 02.03.2014 / 20:42
2

Assumindo que seus diretórios sempre iniciem em "dir1", e que não existam arquivos chamados $ dir * (todos eles são diretórios numerados seqüencialmente), você pode usar este forro -

mkdir ${dir}$(( 'ls ${dir}* | wc -w' + 1 ))

Isso conta o número de arquivos que começam com $ dir, adiciona um a esse número e cria um novo arquivo.

    
por 02.03.2014 / 21:20
0

Adendo às outras respostas: Se você precisar que os dirs classifiquem corretamente pelo nome, você também pode querer preencher o novo número dir (NUM) com zeros à esquerda para um tamanho fixo.

O seguinte pode ser condensado em uma linha ou incorporado em uma das outras soluções.

NUM="00"$NUM                  ## Left zero pad with fixed length - 1 zeros 
NUM=${NUM:((${#NUM} - 3)):3}  ## left trim to fixed length (3 in this case)

Isso pressupõe que NUM começa pelo menos 1 dígito de comprimento e não excederá o comprimento fixo. Ajuste de acordo com suas necessidades.

    
por 03.03.2014 / 22:21