Copiando e renomeando arquivos para um único diretório por um único shell script

1

Eu tenho vários arquivos com um exemplo de como eles são exibidos abaixo.

-rw-r--r--   1 my_user     users           12 Dec 13 09:56 Example_30_001_20130913175000.DAT  
-rw-r--r--   1 my_user     users           12 Dec 13 09:57 Example_30_002_20130913180854.DAT  
-rw-r--r--   1 my_user     users           12 Dec 13 09:58 Example_30_003_20130913180857.DAT  
-rw-r--r--   1 my_user     users           12 Dec 13 09:58 Example_30_004_20130913180901.DAT  
-rw-r--r--   1 my_user     users           12 Dec 13 09:59 Example_30_005_20130913180904.DAT  
-rw-r--r--   1 my_user     users           12 Dec 13 10:02 Example_30_006_20130913180907.DAT  
-rw-r--r--   1 my_user     users           12 Dec 13 09:59 Example_30_007_20130913180911.DAT  

Minha pergunta é como copiá-los no mesmo diretório e renomear os arquivos copiados usando um script sh tal que eles começam com algo como os nomes de arquivos mostrados abaixo?

Ex_Example_001.DAT  
Ex_Example_002.DAT  
Ex_Example_003.DAT  
Ex_Example_004.DAT  
Ex_Example_005.DAT  
Ex_Example_006.DAT  
Ex_Example_007.DAT
    
por CHT 13.12.2013 / 06:26

2 respostas

1

Execute isto na pasta dos seus arquivos:

find . -type f -name "Example_30*.DAT" | awk -F\_ '{printf "cp -v %s Ex_Example_%s.DAT\n", $0, $3}' | bash
  • find . -type f : pesquisa apenas por arquivos
  • -name "Example_30*.DAT" : arquivo começando com "Example_30" e terminando com ".DAT"
  • | awk -F\_ : canalize isso para awk e defina o delimitador para _
  • '{printf "cp -v %s Ex_Example_%s.DAT\n", $0, $3}' : gere um comando assim: cp -v oldname newname
  • | bash : e canalize isso para bash para executá-lo

A saída deve ficar assim:

»./Example_30_002_20130913180854.DAT“ -> »Ex_Example_002.DAT“
»./Example_30_005_20130913180904.DAT“ -> »Ex_Example_005.DAT“
»./Example_30_003_20130913180857.DAT“ -> »Ex_Example_003.DAT“
»./Example_30_006_20130913180907.DAT“ -> »Ex_Example_006.DAT“
»./Example_30_007_20130913180911.DAT“ -> »Ex_Example_007.DAT“
»./Example_30_004_20130913180901.DAT“ -> »Ex_Example_004.DAT“
»./Example_30_001_20130913175000.DAT“ -> »Ex_Example_001.DAT“

Editar:

What if I want it to be put in a script outside of that folder? How would I go about doing it?

Crie um arquivo chamado script . Adicione as seguintes linhas ao arquivo:

#!/bin/bash
DIRECTORY=/path/to/dir/
cd $DIRECTORY
find . -type f -name "Example_30*.DAT" | awk -F\_ '{printf "cp -v %s Ex_Example_%s.DAT\n", $0, $3}' | bash
cd -

Torne o script executável:

chmod u+x script

Depois, chame o script:

./script

ou

/absolute/path/to/script
    
por 13.12.2013 / 07:56
1

No zsh:

autoload -U zmv
zmv -C -o -p '/path/to/source/directory/(Example_)[0-9]##_([0-9]##)_20130913175000(.DAT)' '/path/to/destination/directory/Ex_$1$2$3'

Em outros shells:

cd /path/to/source/directory/
for source in Example_*_*_*.DAT; do
  tail=${source##*/}
  target=Ex_${tail%%_*}; tail=${tail#*_}
  tail=${tail#*_}
  target=${tail%%_*}.${tail##*.}
  cp -p "$source" "target"
done
    
por 14.12.2013 / 02:18