使用 cygwin bash shellscript 在管道中复制文件

使用 cygwin bash shellscript 在管道中复制文件

我需要选择目录中的某些文件并使用 cygwin 脚本将它们复制到另一个目录,但我无法获取复制的语法。即

对于 i 在cat boards do ls -t $work |grep ^$i |cp .............

如果我只使用 grep 运行,它会列出我想要的所有文件,但我不知道如何在 cp cmnd 上获取这些文件。

我很久没有做过这些事情了,但似乎记得有一个自动变量包含来自 stdin 的输入。任何帮助都值得感激。

答案1

听起来你正在寻找参数

destination="/path/to/folder"
for i in $(cat boards)
do 
     ls -t $work | grep ^$i | xargs -Isource cp source /path/to/destination
done

for使用i填充结果的变量运行循环cat boards$()产生一个进程)。

xargs -Isource获取 的输出grep ^$i并将其输入cpsource的位置cp source /path/to/destination。来自手册页:

-I replace-str Replace occurrences of replace-str in the initial-arguments with names read from standard input.

希望这就是您所寻找的。

答案2

我假设您希望所有复制的文件都集中在同一个位置。

听起来您想要将 /path/to/$work 中的所有文件(其中文件名以 boards 文件中的一行开头)复制到某个目的地。

例如,给定

$ cat boards
start1
start2
$ ls $work
start1.txt
start1.jpg
start2.txt
start2.jpg
start3.txt
$

您希望将 start1.txt、start1.jpg、start2.txt 和 start2.jpg 复制到某个地方,但不复制 start3.txt。

不要使用 xargs:它是一个很棒的工具,但是如果您的任何文件或“搜索模式”有空格或通配符(例如“*”),它会导致问题。

相反,使用需要搜索模式的工具,寻找

cat boards | while read pattern
find $work -name "${pattern}*" -exec cp {} /path/to/destination +
done

这将把 的每一行读入boards为搜索模式。find然后将在$work目录中查找匹配的文件(和文件夹!)${pattern}*;每个找到的项目(文件或文件夹)将作为正确转义的参数(在点中{})传递给 cp,并且它会执行类似最小化由于 而启动的进程xargs数(如果您希望每个找到的项目恰好一个进程,则可以改用- 但请确保正确转义它)。cp+;

find有丰富的过滤器,您可以应用它们来缩小搜索范围。特别值得注意的是-type f将结果限制为文件的选项。

请注意,cp如果传入的参数列表中有文件夹,则命令可能会失败find;使用-type f过滤器将防止这种情况发生。

还要注意,该cp命令将“扁平化”输出目录 - 如果$work有子目录恰好有匹配的文件,则这些文件将直接复制到/path/to/destination。如果您只想复制顶层的文件$work-maxdepth过滤器(可能值为 1: -maxdepth 1)将防止find在文件系统中递归得太深。

还要注意find区分大小写。如果您不想区分大小写,可以使用-iname而不是-name来进行不区分大小写的搜索。

如果您想提供任何其他命令行参数cp,只需将它们放在前面{}(例如,cp -r {}复制与搜索模式匹配的目录)。

相关内容