我的目录结构如下所示。我需要将所有文件夹从 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"' {} \;
如果Test2
和Test3
位于同一文件系统上,并且下面有许多文件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