我试图复制一些带有编号的文件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