我需要选择目录中的某些文件并使用 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
并将其输入cp
到source
的位置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 {}
复制与搜索模式匹配的目录)。