我想搜索其名称中包含特定文本的所有.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
但当然这些都不起作用。还有其他想法吗?
答案 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) \;
。将替换当前处理的文件的名称而不是占位符{}
。
对此类任务非常有用的其他命令是sed
和awk
。
答案 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命令。我没有对它进行过深度测试,如果没有,我正在等待你的评论。