Como renomear vários diretórios?

0

Aqui estão meus diretórios:

P [001]
P [002]
P [003]

Eu quero renomear para:

P001
P002
P003

Eu usei o código:

for P in *\ *; do mv '$P' '${P// /_}'; done

mas estou sentindo falta de algo.

    
por Relyativist 31.08.2018 / 15:48

3 respostas

1

Experimente prename

$ ls
P [001]  P [002]  P [003]
$ prename 's/[ \[\]]//g' P\ *
$ ls
P001  P002  P003
$

Como alternativa, continue com sua abordagem de script original (com um pequeno ajuste de ' to " e uma pequena alteração no regexp)

$ ls
P [001]  P [002]  P [003]
$ for P in *\ *; do mv "$P" "${P//[\[\] ]/}" ; done
$ ls
P001  P002  P003
$
    
por 31.08.2018 / 16:08
0

Antes de mais nada, você deve usar aspas duplas em torno de $P

o seguinte deve fazer o trabalho, mesmo que não seja um único comando:

for P in *\ *; do rename "s/ //g" * && rename "s/[][]//g" *; done

a primeira renomeação remove o espaço em branco, a segunda remove os colchetes

    
por 31.08.2018 / 16:10
0

Você estava perto de abaixo para remover espaços (na verdade, você está substituindo por sublinhado), mas você precisou usar aspas duplas em vez de aspas simples, o que impedirá a expansão das variáveis.

Além disso, você também deve saber que, como você não está validando a variável P se for um diretório ou um arquivo, você poderá renomear os arquivos.

for P in *\ *;
do
    [ -d "$P" ] && mv "$P" "${P// /_}" || echo 'skipping, the'"$P"' is not a directory'
done

Você também pode fazer o seguinte para remover todos os espaços / colchetes:

find -maxdepth 1 -type d -name 'P*' -exec bash -c 'echo ${1} ${1//[][ ]}' bash {} \;
./P [001] ./P001
./P [002] ./P002
./P [003] ./P003
    
por 31.08.2018 / 16:07