Renomeia o arquivo pelo nome da pasta

0

Eu tenho um tipo de pastas (A, B, C, D, E, F, G, H) e eu tenho um arquivo em cada pasta tem o mesmo nome em todas as pastas (arquivo.txt), mas o tamanho deste arquivo é diferente de pasta para pasta. Eu queria copiar este arquivo de cada pasta em uma nova pasta (X) e dar o mesmo nome do arquivo é a pasta original. Eu usei este script bach para copiar os arquivos:

#!/bin/bash      
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 

for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/${i} <path to the new folder X >
done

Neste código, todos os arquivos irão escrever na nova pasta (X), porque eles têm o mesmo nome dentro das pastas. Como posso revisar esse código para adicionar o nome da pasta ao nome do arquivo para que eu possa saber a origem do arquivo.

    
por roaima 05.02.2015 / 02:02

4 respostas

0

Supondo que seus subdiretórios estejam localizados em $insub_FIM_M_1 e que o arquivo que você deseja copiar seja chamado de file.txt em cada um desses subdiretórios,

mkdir -p result || exit 1
for pathname in "$insub_FIM_M_1"/*/file.txt; do
    cp "$pathname" "result/$( basename "$( dirname "$pathname" )" )_file.txt"
done

copiaria esses arquivos para o diretório result no diretório atual, renomeando cada arquivo de acordo com o diretório em que eles estão localizados.

    
por 13.09.2018 / 15:30
1

No caso especial em que o diretório é o diretório pai, você pode usar renomear / prename [1] no diretório pai para mover os arquivos para esse diretório pai:

rename -n 's:/:-:g' */file.txt

( -n é para execuções secas, remova-o ou substitua por -v para execução real)

Se os arquivos .txt tiverem vários níveis de profundidade (ou a uma profundidade desconhecida), você poderá usar a opção globstar:

shopt -s globstar  # makes '**' match any levels of directories
rename -n 's:/:-:g' **/*.txt

[1] O comando é rename no Debian / Ubuntu e derivados e prename no Redhat / Fedora e derivados

    
por 20.09.2018 / 09:04
0

Não sei bem por que você está usando cat FIM_1.txt , pois esse é um arquivo sobre o qual você não nos falou. Esse código copiará file.txt de cada conjunto de pastas e colocará no diretório X nomeado como a pasta de onde veio.

cd "$insub_FIM_M_1"
for DIR in *
do
    test -d "$DIR" -a -f "$DIR/file.txt" || continue
    mv -f "$DIR/file.txt" "/path/to/X/$DIR"
done
    
por 06.02.2015 / 00:16
0

Eu tentei o seguinte código e funcionou:

 #!/bin/bash   
insub_FIM_M_1=path to a parent folder conatin all the folders (A,B,C,D,E,F,G,H) 
out=path 
for i in $(cat $insub_FIM_M_1/FIM_1.txt); do
cp  insub_FIM_M_1/file.txt ${path}/${i}.txt
done
    
por 05.02.2015 / 02:47