For 循环不适用于数字标记的目录

For 循环不适用于数字标记的目录

我从来没有遇到过这个问题:我有一些数字编号的文件夹,因此我可以循环浏览文件,甚至使用并行化,而不必担心所有文件名完全不同。

在这种情况下,我将所有文件分成标记sample_1为 的文件夹sample_18并使用超级简单for 循环:

for i in {1..18};
do
  cd sample_${i}
  mv *.fa sample_${i}.fa
  mv *.gff sample_${i}.gff
  mv *.bam sample_${i}.bam
  mv *.sam sample_${i}.sam
  cd ..
done

它适用于 1-9,但不适用于两位数。它实际上会给出目录sample_10不存在的错误。我冒险它与 bash 有关,当我命名目录时,我认为它是 1,然后是 0 而不是 10,但老实说我不知道​​如何修复它。有人有主意吗?

编辑:

显示 ll 命令产生的内容。所有的目录都在那里。

-rw-rw---- 1 anm5579 mls164_collab  644 Sep 18 11:18 contentsInfo
-rw-rw---- 1 anm5579 mls164_collab   44 Sep 27 16:07 fixdata.sh
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_1
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 21 17:08 sample_10
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 18 10:59 sample_11
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 20 11:11 sample_12
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 21 17:12 sample_13
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 18 11:12 sample_14
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 18 11:11 sample_15
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 21 10:40 sample_16
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 20 11:08 sample_17
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 18 11:11 sample_18
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_2
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_3
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_4
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_5
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_6
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_7
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_8
drwxrws--- 2 anm5579 mls164_collab 4096 Sep 27 15:59 sample_9

产生的错误是没有找到样本 10-18 的目录。

显示 hexdump 生成的内容echo sample_* | hexdump -C

00000000  73 61 6d 70 6c 65 5f 31  20 73 61 6d 70 6c 65 5f  |sample_1 sample_|
00000010  31 30 20 73 61 6d 70 6c  65 5f 31 31 20 73 61 6d  |10 sample_11 sam|
00000020  70 6c 65 5f 31 32 20 73  61 6d 70 6c 65 5f 31 33  |ple_12 sample_13|
00000030  20 73 61 6d 70 6c 65 5f  31 34 20 73 61 6d 70 6c  | sample_14 sampl|
00000040  65 5f 31 35 20 73 61 6d  70 6c 65 5f 31 36 20 73  |e_15 sample_16 s|
00000050  61 6d 70 6c 65 5f 31 37  20 73 61 6d 70 6c 65 5f  |ample_17 sample_|
00000060  31 38 20 73 61 6d 70 6c  65 5f 32 20 73 61 6d 70  |18 sample_2 samp|
00000070  6c 65 5f 33 20 73 61 6d  70 6c 65 5f 34 20 73 61  |le_3 sample_4 sa|
00000080  6d 70 6c 65 5f 35 20 73  61 6d 70 6c 65 5f 36 20  |mple_5 sample_6 |
00000090  73 61 6d 70 6c 65 5f 37  20 73 61 6d 70 6c 65 5f  |sample_7 sample_|
000000a0  38 20 73 61 6d 70 6c 65  5f 39 0a                 |8 sample_9.|
000000ab

答案1

手动测试,一步一步,遇到问题就调试。

i=10
cd sample_${i}
mv *.fa sample_${i}.fa
mv *.gff sample_${i}.gff
mv *.bam sample_${i}.bam
mv *.sam sample_${i}.sam
cd ..

如果它说sample_10 doesn't exist,请检查它。

答案2

我认为你的逻辑在某个地方有问题,并且 Sample_9 中有一个重复的文件是导致命令失败的原因,但由于输入评论太麻烦,而且您似乎离线,所以我无法邀请您加入聊天,请尝试以下操作:

#!/bin/bash
set -x
for i in {1..18};
do
  (
    cd "sample_${i}"
    pwd
  )
done

并将上述输出提供到您的问题中。我们将从那里拿走它。

相关内容