Remover caracteres ao nomear arquivos ou pastas

4

Eu tenho um arquivo de texto com várias linhas. Em cada linha, tenho a data no seguinte formato:

12/2/2015
15/9/2013
08/3/2011
02/5/2005
.
.
.

Eu quero criar uma pasta para cada linha neste arquivo de texto usando um simples for loop da seguinte forma:

#!/bin/bash -f
for f in $(cat ./file.txt ); do 
mkdir ${f}
done

Este código não funcionou porque eu tenho o caractere / no formato de data. Como posso criar as pastas e remover esse caractere do nome da pasta ao mesmo tempo? Então os nomes das pastas de saída serão assim:

1222015
1592013
0832011
0252005
.
.
.
    
por jasonwryan 07.08.2015 / 20:43

5 respostas

8

Você pode usar um comando como este:

sed -e 's/\///g' < file.txt | xargs mkdir

O comando sed removerá as novas linhas do arquivo.txt e o canal para xargs executará mkdir para cada linha no arquivo.

Um comando equivalente (sugerido por don_crissti) usando tr em vez de sed é:

tr -d / < file.txt | xargs mkdir
    
por 07.08.2015 / 20:50
3

Em vez de reinventar em perl ou algo parecido, peguei seu código original e adicionei a parte relevante para remover os incômodos / caracteres.

A // inicial é a sintaxe bash para a substituição global (já que temos mais de um problema /).

O subseqüente / é representar o que queremos substituir (/).

O final / precede o que queremos substituí-lo por (nada).

#!/bin/bash -f
for f in $(cat ./file.txt ); do
mkdir ${f////}
done
    
por 07.08.2015 / 21:05
2

E possível solução com awk :

awk -F"/" '{ print $1 $2 $3; }' file | xargs mkdir
    
por 07.08.2015 / 21:58
1

Esta linha perl funciona para mim.

cat data01.txt  |perl -ane 'chomp;s/\s+//g; s{\/}{}g; mkdir $_ if length($_);'
    
por 07.08.2015 / 20:54
1

Aqui está uma maneira com bash e sed

for var in $(cat data01.txt); do  dir=$(echo $var | sed -e 's/\///g;'); mkdir -vp $dir; done
    
por 07.08.2015 / 20:57