Substituir vários arquivos por um arquivo

2

Imagine meu diretório com esta aparência:

./original.txt
./blah.1.txt
./blah.2.txt
[...]
./blah.999999.txt

Eu quero essencialmente substituir cada arquivo blah.* pelo conteúdo de original . Minha tentativa inicial foi fazer isso:

$ cp original.txt blah.*

Mas eu recebo:

cp: target ''blah.1.txt' is not a directory

    
por Nathan J. Brauer 14.09.2012 / 02:30

5 respostas

5

Apenas mais uma opção com tee :

cat original.txt | tee blah.*

E aqui está um caso de teste que você pode experimentar em casa, sob a supervisão de um adulto responsável:

$ echo "rawr" | tee blah.{1..99}.txt
rawr

$ ls
blah.10.txt  blah.26.txt  blah.41.txt  blah.57.txt  blah.72.txt  blah.88.txt
blah.11.txt  blah.27.txt  blah.42.txt  blah.58.txt  blah.73.txt  blah.89.txt
blah.12.txt  blah.28.txt  blah.43.txt  blah.59.txt  blah.74.txt  blah.8.txt
blah.13.txt  blah.29.txt  blah.44.txt  blah.5.txt   blah.75.txt  blah.90.txt
blah.14.txt  blah.2.txt   blah.45.txt  blah.60.txt  blah.76.txt  blah.91.txt
blah.15.txt  blah.30.txt  blah.46.txt  blah.61.txt  blah.77.txt  blah.92.txt
blah.16.txt  blah.31.txt  blah.47.txt  blah.62.txt  blah.78.txt  blah.93.txt
blah.17.txt  blah.32.txt  blah.48.txt  blah.63.txt  blah.79.txt  blah.94.txt
blah.18.txt  blah.33.txt  blah.49.txt  blah.64.txt  blah.7.txt   blah.95.txt
blah.19.txt  blah.34.txt  blah.4.txt   blah.65.txt  blah.80.txt  blah.96.txt
blah.1.txt   blah.35.txt  blah.50.txt  blah.66.txt  blah.81.txt  blah.97.txt
blah.20.txt  blah.36.txt  blah.51.txt  blah.67.txt  blah.82.txt  blah.98.txt
blah.21.txt  blah.37.txt  blah.52.txt  blah.68.txt  blah.83.txt  blah.99.txt
blah.22.txt  blah.38.txt  blah.53.txt  blah.69.txt  blah.84.txt  blah.9.txt
blah.23.txt  blah.39.txt  blah.54.txt  blah.6.txt   blah.85.txt
blah.24.txt  blah.3.txt   blah.55.txt  blah.70.txt  blah.86.txt
blah.25.txt  blah.40.txt  blah.56.txt  blah.71.txt  blah.87.txt

$ cat blah.67.txt 
rawr

$ echo "hooray" > original.txt

$ cat original.txt | tee blah.*.txt
hooray

$ cat blah.67.txt 
hooray
    
por Oli 14.09.2012 / 03:27
2

Use for do bash (supondo que você esteja usando o bash):

for file in blah.*.txt; do
    cp original.txt "$file"
done
    
por Ry- 14.09.2012 / 02:36
1

Você poderia tentar isso, evitando os loops e mantendo as coisas em uma linha:

ls blah.* | xargs -n 1 cp original

Você está recebendo cp: target blah.1.txt is not a directory em sua tentativa original, porque copiar vários arquivos supõe mover todos eles para o diretório fornecido como o último argumento. É simplesmente uma sintaxe errada. Citando man cp :

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Usar apenas cp não ajudará você. Veja também esta questão .

    
por gertvdijk 14.09.2012 / 02:41
1

Faça isso:

for i in 'ls *.txt'; do cat original > $i; done

em que original é o arquivo de texto. cat apenas copia o conteúdo e o > canaliza o conteúdo para um novo arquivo representado por $i (expandido da lista retornada pelo comando ls *.txt )

Observe que isso sobrescreverá completamente esses arquivos, portanto você pode querer colocá-los em primeiro lugar em outro diretório. Isso também serve para qualquer coisa com uma extensão .txt (incluindo o arquivo original, se for uma extensão .txt), assim você pode querer renomear coisas ou usar uma convenção melhor (por exemplo, blah * em vez de * .txt)

    
por Ian B. 14.09.2012 / 02:42
1

Aqui está outra opção usando find :

find ./ -name 'blah.*.txt' -exec cp original.txt {} \;

Você está pedindo que o find inicie no diretório atual e encontre arquivos cujo nome corresponda ao padrão (entre aspas, para evitar que o shell o expanda e deixe encontrar a expansão padrão), e para cada arquivo encontrado, execute o comando entre -exec e \; . Neste comando, {} é substituído pelo nome do arquivo encontrado.

Veja esta resposta para obter uma boa quantidade de informações sobre como usar find de forma eficaz:

Como posso usar o comando find com mais eficiência?

    
por roadmr 14.09.2012 / 03:54