如何移动同名文件并连接

如何移动同名文件并连接

我的目录结构如下所示。我需要将所有文件夹从 Test3 移动到 Test2 并连接具有相同名称的文件

[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

我试过

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

没有任何效果,但是当我尝试时

cp -r Test3/* Test2/

它会覆盖。

我希望将文件连接起来。最后,我需要有一个 Test2 目录,并且在每个样本下,Test3 目录中的 fastq 文件将连接到 Test2 目录中相应的 fastq 文件。

答案1

没有内置的方法来连接文件并删除它,您必须将其分为两个步骤。

在 zsh 中,或在 bash ≥4 中运行后shopt -s globstar,或在 ksh 中运行后set -o globstar

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

无需**递归到子目录,请使用find.

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

如果Test2Test3位于同一文件系统上,并且下面有许多文件Test3在目标中没有相应的文件,则可以通过移动文件而不是将其连接到空文件来节省一些执行时间:

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

相关内容