将文件列表复制到目录

时间:2013-12-16 02:00:48

标签: bash copying

我想搜索其名称中包含特定文本的所有.fits文件,然后将它们复制到目录中。

我可以使用名为fetchKeys的命令列出包含'foo'

的文件

命令如下所示:fetchKeys -t 'foo' -F | grep .fits

这将返回包含“foo”的.fits文件列表。大!现在我想将所有这些复制到目录/path/to/dir。单独的文件太多了,我需要使用一个命令复制它们。

我在想:

fetchKeys -t 'foo' -F | grep .fits > /path/to/dir

cp fetchKeys -t 'foo' -F | grep .fits /path/to/dir

但当然这些都不起作用。还有其他想法吗?

3 个答案:

答案 0 :(得分:4)

如果是在Linux / Unix上,你可以使用find命令吗?这看起来非常像fetchkeys

$ find . -name "*foo*.fit" -type f -print0 | while read -r -d $'\0' file
do
    basename=$(basename $file)
    cp "$file" "$fits_dir/$basename"
done

find命令将在其名称中找到与*foo*.fits匹配的所有文件。 -type f表示他们必须是文件而不是目录。 -print0表示打印出找到的文件,但用NUL字符分隔。通常,find命令只会在每一行返回一个文件,但如果文件名包含空格,制表符,新行或甚至其他奇怪的字符,该怎么办?

-print0将使用空值(\ 0)分隔出文件,而read -d $'\0' file表示读取由这些空字符分隔的每个文件。如果您的文件不包含空格或奇怪字符,则可以执行以下操作:

$ find . -name "*foo*.fit" -type f | while read file
do
    basename=$(basename $file)
    cp "$file" "$fits_dir/$basename"
done

基本上,您将使用find命令找到的每个文件读入shell变量file。然后,您可以使用该文件将该文件复制到$fits_dir或任何您想要的地方。

同样,也许有理由使用fetchKeys,并且可以用find替换fetchKeys,但我不知道fetchKeys命令。

答案 1 :(得分:3)

将名称中包含foo的所有文件复制到某个目录:

find . -name "*foo*.fit" -type f -exec cp {} "/path/to/dir/" \; 

将包含foo的所有文件本身复制到某个目录(没有xargs的解决方案):

for f in `find . -type f  -exec grep -l foo {} \;`; do cp "$f" /path/to/dir/; done

find命令包含非常有用的参数-exec-print-delete。它们非常强大,无需手动处理文件名。 -exec的语法是:-exec (what to do) \;。将替换当前处理的文件的名称而不是占位符{}

对此类任务非常有用的其他命令是sedawk

答案 2 :(得分:1)

xargs工具可以为每条线执行从stdin获取的命令。这次,我们执行cp命令:

fetchkeys -t 'foo' -F | grep .fits | xargs -P 1 -n 500 --replace='{}' cp -vfa '{}' /path/to/dir

xargs是一个非常有用的工具,虽然它的参数化并不是真正的微不足道。此命令读入500个.fits文件,并为每个组调用单个cp命令。我没有对它进行过深度测试,如果没有,我正在等待你的评论。