Bash 将文件列表复制到目录

Bash 将文件列表复制到目录,bash,copying,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

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

我可以使用名为fetchKeys的命令来列出包含“foo”的文件

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

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

我的想法是:

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


当然,这两种方法都不管用。还有其他想法吗?

这个
xargs
工具可以为它从stdin获得的每一行执行一个命令。这一次,我们执行
cp
命令:

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

xargs
是一个非常有用的工具,尽管它的参数化并不简单。此命令读取500.fits文件,并为每个组调用单个cp命令。我没有对它进行深入测试,如果它不能运行,我正在等待您的评论。

xargs工具可以对从stdin获得的每一行执行一个命令。这一次,我们执行
cp
命令:

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

xargs
是一个非常有用的工具,尽管它的参数化并不简单。此命令读取500.fits文件,并为每个组调用单个cp命令。我没有对它进行深入测试,如果它没有运行,我正在等待您的评论。

如果这是在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
表示打印出找到的文件,但用字符分隔。通常,
find
命令只会在每一行返回一个文件,但是如果文件名包含空格、制表符、新行,甚至其他奇怪的字符,该怎么办

-print0
将用空(\0)分隔文件,
读取-d$'\0'文件
意味着读取由这些空字符分隔的每个文件。如果文件不包含空格或奇怪字符,可以执行以下操作:

$ find . -name "*foo*.fit" -type f | while read file
do
    basename=$(basename $file)
    cp "$file" "$fits_dir/$basename"
done
基本上,您可以将使用find命令找到的每个文件读入shell变量
file
。然后,您可以使用它将该文件复制到您的
$fits\u dir
或任何您想要的地方


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

如果在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
表示打印出找到的文件,但用字符分隔。通常,
find
命令只会在每一行返回一个文件,但是如果文件名包含空格、制表符、新行,甚至其他奇怪的字符,该怎么办

-print0
将用空(\0)分隔文件,
读取-d$'\0'文件
意味着读取由这些空字符分隔的每个文件。如果文件不包含空格或奇怪字符,可以执行以下操作:

$ find . -name "*foo*.fit" -type f | while read file
do
    basename=$(basename $file)
    cp "$file" "$fits_dir/$basename"
done
基本上,您可以将使用find命令找到的每个文件读入shell变量
file
。然后,您可以使用它将该文件复制到您的
$fits\u dir
或任何您想要的地方


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

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

find . -name "*foo*.fit" -type f -exec cp {} "/path/to/dir/" \; 
将包含
foo
的所有文件本身复制到特定目录(不含
xargs
的解决方案):

find
命令具有非常有用的参数
-exec
-print
-delete
。它们非常健壮,无需手动处理文件名。
-exec
的语法是:
-exec(要做什么)\。将替换当前处理的文件名,而不是占位符
{}


其他对此类任务非常有用的命令有
sed
awk

将所有名为
foo
的文件复制到特定目录:

find . -name "*foo*.fit" -type f -exec cp {} "/path/to/dir/" \; 
将包含
foo
的所有文件本身复制到特定目录(不含
xargs
的解决方案):

find
命令具有非常有用的参数
-exec
-print
-delete
。它们非常健壮,无需手动处理文件名。
-exec
的语法是:
-exec(要做什么)\。将替换当前处理的文件名,而不是占位符
{}


其他对此类任务非常有用的命令有
sed
awk

谢谢您的回复。是的,它是Linux,我正在ssh登录到另一台服务器,我可以使用这个fetchKeys命令。我对它了解不多,也没有“男人”。抱歉,我犯了一个错误,“foo”不存在于文件名中,它是一个对象的名称,我假设它是在fits文件中的某个地方声明的。因此,fetchKeys将首先从fits文件中找到所有名为“foo”的对象,然后我使用grep挑出fits文件。所以我不能在这里用find。有916个文件要复制。有什么想法吗?你可以使用
fetchKeys-t'foo'-F | grep.fits
并将其传送到
,同时