Como mover arquivos com o mesmo nome e concatenar

1

Minha estrutura de diretórios é fornecida abaixo. Eu preciso mover todas as pastas de Test3 para Test2 e concatenar os arquivos com os mesmos nomes

[jg@hpc Test2]$ tree
.
|-- Sample_1008
|   |-- 1008_ATCACG_L002_R1_001.fastq
|   |-- 1008_ATCACG_L002_R2_001.fastq
|   |-- 1008_ATCACG_L006_R1_001.fastq
|   '-- 1008_ATCACG_L006_R2_001.fastq
'-- Sample_1009
    |-- 1009_CGATGT_L002_R1_001.fastq
    |-- 1009_CGATGT_L002_R2_001.fastq
    |-- 1009_CGATGT_L006_R1_001.fastq
    '-- 1009_CGATGT_L006_R2_001.fastq

[jg@hpc Test3]$ tree
.
|-- Sample_1008
|   |-- 1008_ATCACG_L002_R1_001.fastq
|   |-- 1008_ATCACG_L002_R2_001.fastq
|   |-- 1008_ATCACG_L006_R1_001.fastq
|   '-- 1008_ATCACG_L006_R2_001.fastq
'-- Sample_1009
    |-- 1009_CGATGT_L002_R1_001.fastq
    |-- 1009_CGATGT_L002_R2_001.fastq
    |-- 1009_CGATGT_L006_R1_001.fastq
    '-- 1009_CGATGT_L006_R2_001.fastq

Eu tentei

mv Test3/* /auto/dr-lc_sa1/Data/Test2

nada funcionou, mas quando tentei

cp -r Test3/* Test2/

Substitui.

Eu quero que os arquivos sejam concatenados. No final, preciso ter um diretório Test2 e sob cada amostra e seus arquivos fastq no diretório Test3 serão concatenados aos arquivos fastq correspondentes no diretório Test2.

    
por Jana 16.11.2012 / 22:56

1 resposta

3

Não há uma maneira interna de concatenar um arquivo e removê-lo, você terá que dividi-lo em duas etapas.

Em zsh, ou em bash ≥4 após executar shopt -s globstar , ou em ksh após executar set -o globstar :

cd Test3
for x in **/*.fastq; do
  cat "$x" >>"/auto/dr-lc_sa1/Data/Test2/$x" && rm "$x"
done

Sem ** para recorrer a subdiretórios, use find .

cd Test3
find . -name '*.fastq' -exec sh -c 'cat "$0" >>"/auto/dr-lc_sa1/Data/Test2/$0" && rm "$0"' {} \;

Se Test2 e Test3 estiverem no mesmo sistema de arquivos e houver muitos arquivos em Test3 que não tenham um arquivo correspondente no destino, você poderá economizar algum tempo de execução movendo o arquivo em vez de concatenar em um arquivo vazio:

for x in **/*.fastq; do
  if [ -s "../Test2/$x" ]; then
    cat "$x" >>"/auto/dr-lc_sa1/Data/Test2/$x" && rm "$x"
  else
    mv "$x" "/auto/dr-lc_sa1/Data/Test2/$x"
  fi
done
    
por 16.11.2012 / 23:28