【问题标题】:How to use `file | grep <string>` in a find command?如何使用`文件 | grep <string>` 在查找命令中?
【发布时间】:2020-01-24 22:17:22
【问题描述】:

虽然听起来很简单和天真,但我正在为findfile 命令而苦苦挣扎。我使用-exec file 是因为我需要获取的特定文件在文件名中没有它们的扩展名,这消除了find-name 选项的可能性。请参阅下面的find 命令和工作区:

我当前的代码:

workspace=/PATH/
### --- Example hierarchy of where all the files needed are located recursively:
##### -----("$workspace"/ID/ID/DICOM/cat)
####### ------- 'cat' is a .dcm file, without ".dcm" in its name

PETS=`find . -type f -exec file {} \; | grep "DICOM"`

我当前的输出,看起来像 find 的典型输出:

./PATH/ID/ID/DICOM/cat: DICOM medical imaging data(1)

默认情况下,我会这样做以将其分配给变量:

PETS=($(find . -type f -exec file {} \; | grep "DICOM"))

但是,我仅通过此输出获得第一个实例(当有许多其他 DICOM 文件位于与工作目录相关的位置时),这几乎是我上面 (1) 中当前输出的截断版本

./PATH/ID/ID/DICOM/cat:(2)

如何从 (1) 或 (2) 或修改我的 find 命令获取文件本身,以便将其输入到 dcmdump utility from the dctmk Toolbox

【问题讨论】:

  • dcmdump 支持递归搜索目录中的文件。当使用选项 +fo (--read-file-only) 调用时,您还可以确保此工具仅实际处理(即解析)DICOM 文件。

标签: linux file find dcmtk


【解决方案1】:

语法有点复杂,但是如果您可以在 -exec 操作中同时调用 filegrep,那么您可以继续链接其他操作,而无需任何中间变量。

这样做的方法是创建一个包含file | grep 管道的显式子shell:sh -c 'file "$1" | grep -q DICOM'"$1" 是被检查文件的占位符,因为这就是 shell 脚本接受参数的方式。 (在脚本中嵌入{} 不是一个好主意。我们会遇到空格和引号等特殊字符的问题。)

那么我们如何设置$1?通过将参数附加到 shell 命令的答案:sh -c '&lt;script&gt;' arg0 arg1 arg2... 将位置参数$0$1$2 等设置为字符串arg0arg1arg2 等.让我们这样做。我们可以将$0设置为sh,即shell的名字;和$1{},文件名来自find

整个-exec 操作可以被视为通过或失败的测试,与-type f 等更简单的测试没有什么不同。我们可以链接其他条件操作,例如调用dcmdump

我们一起得到:

find . -type f -exec sh -c 'file "$1" | grep -q DICOM' sh {} \; -exec dcmdump {} +

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多