Bash 从文件中的字符串复制与子目录和文件名匹配的文件
我想将文件从多个子目录复制到主目录中名为Bash 从文件中的字符串复制与子目录和文件名匹配的文件,bash,copy,Bash,Copy,我想将文件从多个子目录复制到主目录中名为copiedFiles/的新目录。我只想复制可以与文件strs2bMatchd.csv中的字符串匹配的文件。子目录的名称也与要匹配的字符串的第一部分匹配(参见下面的示例) 包含子目录的主目录如下所示 main_dir/ strs2bMatchd.csv 1111/ 1111_aaa1_x873.csv 1111_aaa2_x874.csv 1111_ddd1_x443.csv 1111_ddd2_x4
copiedFiles/
的新目录。我只想复制可以与文件strs2bMatchd.csv
中的字符串匹配的文件。子目录的名称也与要匹配的字符串的第一部分匹配(参见下面的示例)
包含子目录的主目录如下所示
main_dir/
strs2bMatchd.csv
1111/
1111_aaa1_x873.csv
1111_aaa2_x874.csv
1111_ddd1_x443.csv
1111_ddd2_x444.csv
1112/
1112_bbb1_x912.csv
1112_bbb2_x913.csv
1112_fff1_x664.csv
1112_fff2_x665.csv
1113/
1113_ccc1_x912.csv
1113_ccc2_x913.csv
要复制的文件应与strs2bMatchd.csv
文件中的字符串匹配
cat strs2bMatchd.csv
1111_aaa1
1111_aaa2
1112_bbb1
1112_bbb2
1113_ccc1
1113_ccc2
这是预期的结果
main_dir/
strs2bMatchd.csv
1111/
1111_aaa1_x873.csv
1111_aaa2_x874.csv
1111_ddd1_x443.csv
1111_ddd2_x444.csv
1112/
1112_bbb1_x912.csv
1112_bbb2_x913.csv
1112_fff1_x664.csv
1112_fff2_x665.csv
1113/
1113_ccc1_x912.csv
1113_ccc2_x913.csv
copiedFiles/
1111_aaa1_x873.csv
1111_aaa2_x874.csv
1112_bbb1_x912.csv
1112_bbb2_x913.csv
1113_ccc1_x912.csv
1113_ccc2_x913.csv
作为替代方案,考虑
M=main_dir
mkdir -p $M/copiedFiles
find $M | grep -F -v "$M/copiedFiles" | grep -Ff $M/strs2bMatch.csv | xargs cp -t $M/copiedFiles/
它将执行查找一次
如果文件可能包含空间或其他特殊字符,请考虑使用安全版本(NUL终止字符串)-查找(-Primt0)、GRIP(-Z-Z)XARGS(-0)。 更新1:OP表示他的cp版本没有-t。替代解决方案,如果没有此选项,则发布
我无法测试,请尝试使用man等解决问题M=main_dir
mkdir -p $M/copiedFiles
find $M | grep -F -v "$M/copiedFiles" | grep -Ff $M/strs2bMatch.csv | xargs -I{} cp {} $M/copiedFiles/
那么,您尝试过什么呢?
cd main_dir&&mkdir copiedFiles&&sed的/.*/'strs2bMatchd.csv | sort-u | xargs find | grep-Ff strs2bMatchd.csv | xargs cp-t copiedFiles
谢谢您的建议。当我尝试它时,我得到了cp:unligal option--t用法:cp[-R[-H |-L |-P][-fi |-n][-apvXc]源文件目标文件cp[-R[-H |-L |-P][-fi 124;-n][-apvXc]源文件。。。目标目录
@jO。你的操作系统/版本是什么。必须是旧的,因为-t是几年前添加到大多数发行版的?我将尝试修改。