【发布时间】: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