无法使用for循环复制一系列文件,找不到问题



我试图复制一些带有编号的文件for i in {};do cp ***;done,但我遇到了错误。

$ for i in {0..2};do cp ./CTCC_noSDS_0$i_hg19.bwt2pairs.validPairs 3_dataset_pool/;done
cp: cannot stat ‘./CTCC_noSDS_0.bwt2pairs.validPairs’: No such file or directory
cp: cannot stat ‘./CTCC_noSDS_0.bwt2pairs.validPairs’: No such file or directory
cp: cannot stat ‘./CTCC_noSDS_0.bwt2pairs.validPairs’: No such file or directory

文件名如下所示:

-rw-r--r-- 1 jiangxu lc_lc 456M Nov 12 20:22 CTCC_noSDS_00_hg19.bwt2pairs.validPairs
-rw-r--r-- 1 jiangxu lc_lc 466M Nov 12 20:23 CTCC_noSDS_01_hg19.bwt2pairs.validPairs
-rw-r--r-- 1 jiangxu lc_lc 473M Nov 12 20:23 CTCC_noSDS_02_hg19.bwt2pairs.validPairs

我可以手动逐个cp文件,但不能使用for循环。似乎系统只是无缘无故地忽略了$i,那么,谁能告诉我命令有什么问题?

使用与 OP 类似的方法

你可以做这样的事情(b.bash调用这个脚本(:

#!/bin/bash
DST_DIR=./mydir/
SRC_DIR=./
for i in {1..5}; do
echo "[*] Trying to find files with number $i"
if [ "$i" -lt 10 ]; then
potential_file="$SRC_DIR/CTCC_noSDS_0${i}_hg19.bwt2pairs.validPairs"
else
potential_file="$SRC_DIR/CTCC_noSDS_${i}_hg19.bwt2pairs.validPairs"
fi
if [ -f "$potential_file" ]; then
echo "[!] Moving $potential_file"
cp "$potential_file" "$DST_DIR"
fi
done

假设当前目录中有以下内容:

$ ls -1
b.bash
CTCC_noSDS_00_hg19.bwt2pairs.validPairs
CTCC_noSDS_01_hg19.bwt2pairs.validPairs
CTCC_noSDS_02_hg19.bwt2pairs.validPairs
CTCC_noSDS_12_hg19.bwt2pairs.validPairs
mydir

假设我们想将这些文件复制到mydir.如果我们运行上面的脚本,我们会看到以下输出:

$ ./b.bash
[*] Trying to find files with number 1
[!] Moving .//CTCC_noSDS_01_hg19.bwt2pairs.validPairs
[*] Trying to find files with number 2
[!] Moving .//CTCC_noSDS_02_hg19.bwt2pairs.validPairs
[*] Trying to find files with number 3
[*] Trying to find files with number 4
[*] Trying to find files with number 5

然后在mydir中查看,我们看到文件:

$ ls -1 mydir/
CTCC_noSDS_01_hg19.bwt2pairs.validPairs
CTCC_noSDS_02_hg19.bwt2pairs.validPairs
  • 请注意,上面的 for 循环只转到5。您可以将其修改为 你觉得合适。
  • 注意 for 循环中的 if 语句及其含义 为。

使用 find : (

您可以改用find命令,如下所示:

find . -type f -iname 'CTCC_noSDS_*_hg19.bwt2pairs.validPairs' -exec bash -c 'cp {} mydir/' ;

下面是使用正则表达式的更安全/更严格的find命令:

find . -regextype sed -regex ".*CTCC_noSDS_[0-9]+_hg19.bwt2pairs.validPairs" -exec bash -c 'cp {} ./mydir/' ;

外壳没有忽略变量。您滥用了变量扩展。变量名称的有效字符包括下划线(其中一个下划线位于$i旁边(。所以,外壳实际看到的是一个名为i__hg19的变量,它是未定义的。因此,文件名不存在。

解决方案是在大括号之间换$i,如下所示:

cp ./CTCC_noSDS_0${i}_hg19.bwt2pairs.validPairs

最新更新