【问题标题】:How to tailor {} in find -exec comand so that it shows folder name instead of full path?如何在 find -exec 命令中定制 {} 以显示文件夹名称而不是完整路径?
【发布时间】:2024-01-17 03:06:01
【问题描述】:

运行 Debian Buster 10.3 和 bash“GNU bash,版本 5.0.3(1)-release (x86_64-pc-linux-gnu)”

data.exe 是一个 Windows 程序,它为目录中的每个文件创建一个带有校验和的 xml 数据文件:

data.exe -t folderA /home/user/data/FolderA

-t 是一个标签描述符。我希望它在每个生成的 xml 文件中显示文件夹名称,而不是完整路径。文件名是文件夹名称。所以文件名是 FolderA.dat

data.exe 通过 wine 在 Linux 中运行

命令或 bash 脚本应该能够反复执行所描述的操作

/home/user/data/
/home/user/data/FolderA
/home/user/data/FolderB
...
/home/user/data/FolderZ

在 Debian 中:

find /home/user/data/ -type d -print -exec wine data.exe -t {} -o {}.dat {} \;

在路径 /home/user/data/ 中正确创建 xml 文件为 FolderA.dat

但是,-t 标记描述符显示完整路径:

<tag>/home/user/data/FolderA</tag>

而不是所需的文件夹名称:

<tag>FolderA</tag>

那么,有没有办法按照我需要的方式修改 {} 的输出?我已经阅读并尝试了比我记忆中更多的组合。甚至将 $pwd 分配给变量并自定义该变量,但不能将该变量传递给 -exec,就好像它是预期的 {}。如果需要,我可以粘贴我的历史文件,这样任何人都可以看到我作为 Linux 爱好者运行的无数测试。如果要走的路是 bash 脚本而不是单行命令,那么欢迎。三天后,我不得不停下来寻求帮助。

提前谢谢你,

编辑:2020-02-26_16:30GMT

只有一个问题:空格' ' 和括号'()' 不会被解释。 反斜杠\ 通常用于转义那些特殊字符。 例如。从命令行

user@debian:~$ wine data.exe -o Folder\ Beta.dat /home/user/data/Folder\ Beta

正确输出Folder Beta.dat-t 标签

find 似乎按原样输出路径,因此 shell 无法正确解释路径。使用sed 可能会有所帮助:

eg. /home/user/data/Folder (Zeta)

find /home/user/data/ -type d | sed -e 's/ /\\ /g' | sed -e 's/(/\\(/g' | sed -e 's/)/\\)/g'

输出

/home/user/data/Folder\ \(Zeta\)

但是如何在find 命令的-exec sh -c 部分将该输出作为输入?

如下示例:

/home/user/data/
/home/user/data/FolderAlpha
/home/user/data/Folder Beta
/home/user/data/Folder-Gamma
/home/user/data/Folder(Delta)
/home/user/data/Folder[Epsilon]

/home/user/data/FolderAlpha
outputs FolderAlpha.dat and -t tag correctly

/home/user/data/Folder Beta
Aborted processing due to errors!

/home/user/data/Folder-Gamma
outputs Folder-GammaAlpha.dat and -t tag correctly

/home/user/data/Folder(Delta
Aborted processing due to errors!
/home/user/data/Folder(Delta: 1: /home/user/data/Folder(Delta: Syntax error: "(" unexpected
/home/user/data/FolderDelta)
Aborted processing due to errors!
/home/user/data/FolderDelta): 1: /home/user/data/FolderDelta): Syntax error: ")" unexpected

/home/user/data/Folder[Epsilon
outputs Folder[Epsilon.dat and -t tag correctly
/home/user/data/FolderEpsilon]
outputs FolderEpsilon].dat and -t tag correctly

【问题讨论】:

    标签: linux find debian exec wine


    【解决方案1】:

    您可以使用${<i>parameter</i>##<i>word</i>} 形式的shell parameter expansion 删除路径头:

    find /home/user/data/ -type d -print -exec sh -c 'wine data.exe -t ${0##*/} -o {}.dat {}' {} \;
    

    …一个问题:空格' '和括号'()'

    为此,我们只需在它们出现在 shell 命令中的三个位置引用名称即可:

    find /home/user/data/ -type d -print -exec sh -c 'wine data.exe -t "${0##*/}" -o "{}".dat "{}"' {} \;
    

    【讨论】:

    • 非常感谢。我不会做到这一点。欣赏解释,信息链接和您的示例。只有一个问题:空格' ' 和括号'()' 不会被解释。反斜杠` is usually used to escape those special characters. Eg. from command line user@debian:~$ wine data.exe -o Folder\ Beta.dat /home/user/data/Folder\ Beta` 正确输出Folder Beta.dat-t 标签。有没有办法在 find -exec 命令中做到这一点?由于评论空间有限的限制,对主题问题进行了扩展解释。再次感谢您,
    • 太棒了!竖起大拇指。
    • 如果这个答案对你有帮助,那么你应该接受它。见*.com/help/someone-answers
    最近更新 更多