Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从文件中的字符串复制与子目录和文件名匹配的文件_Bash_Copy - Fatal编程技术网

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是几年前添加到大多数发行版的?我将尝试修改。