我正在尝试自动svnadmin dump执行备份脚本的命令,并且我想做这样的事情:
find /var/svn/* \( ! -name dir -prune \) -type d -exec svnadmin dump {} > {}.svn \;
Run Code Online (Sandbox Code Playgroud)
这似乎有效,因为它查看 中的每个 svn 存储库/var/svn,并svnadmin dump在其上运行。
但是,{}exec 命令中的第二个不会替换正在处理的目录的名称。它基本上只产生一个名为{}.svn.
我怀疑这是因为 shell 解释>为结束find命令,并尝试将 stdout 从该命令重定向到名为{}.svn.
有任何想法吗?
我遇到了以下代码段:
sh -c 'some shell code' sh …
Run Code Online (Sandbox Code Playgroud)
(其中…表示零个或多个附加参数)。
我知道第一个sh是命令。我知道sh -c应该执行提供的 shell 代码(即some shell code)。第二个目的是sh什么?
类似或相关的问题有时会sh -c在答案中正确使用后作为后续问题出现,并且提问者(或其他用户)想详细了解答案的工作原理。或者它可能是“这段代码做什么?”类型的更大问题的一部分。当前问题的目的是在下面提供规范的答案。
这里涵盖的主要问题、类似或相关问题是:
sh在sh -c 'some shell code' sh …?bash在bash -c 'some shell code' bash …?find-sh在find . -exec sh -c 'some shell code' find-sh {} \;?some shell code在一个 shell 脚本中并且我们调用了./myscript foo …,那么 …鉴于需要从位于子目录中的视频文件中提取音频的情况,如何正确命名生成的文件?
以下单行工作,但保留旧的文件扩展名。
find -name "*.mp4" -exec ffmpeg -i {} -vn -acodec copy {}.aac -hide_banner \;
Run Code Online (Sandbox Code Playgroud)
当前结果:
foobar.mp4 --> foobar.mp4.aac
Run Code Online (Sandbox Code Playgroud)
期望的结果:
foobar.mp4 --> foobar.aac
Run Code Online (Sandbox Code Playgroud) 跑步:
$find . -name *.exe
Run Code Online (Sandbox Code Playgroud)
给出:
./MakeItSo_1.2.2/MakeItSo_1.2.2/MakeItSo.exe
./MakeItSo.exe
Run Code Online (Sandbox Code Playgroud)
但这些并不是目录中唯一的 exe 文件。例如,运行
$find . -name ATLTester.exe
Run Code Online (Sandbox Code Playgroud)
给出:
./Debug/ATLDmoVexaTester.exe
Run Code Online (Sandbox Code Playgroud) 在 Linux 上find -type d工作列出所有子目录,忽略文件。
但是,当我在 Mac (High Sierra) 上运行它时,出现错误:find: illegal option -- t.
在深入研究谷歌时,除了建议我使用ls和解析输出的答案外,我还没有找到任何明显的命令行替代grep方案,或者为 GUI 应用程序或非命令行用户提供解决方案(通过 finder 等) .)
用例是将此输出通过管道传输到模糊查找器,该查找器需要换行符分隔的项目列表。例如,我可以使用文件和ripgrep:rg --files -g "" | fzy. Ripgrep 似乎不支持--folders我在 github 问题跟踪器上粗略浏览的选项等。
在 Linux 上find -type d | fzy“正常工作”。直到安装其他软件包,但我真的希望预先安装一些东西。
我可以通过一些脚本来解决这个问题,但我很想听听这里的最佳实践。
find ×3
bash ×1
command-line ×1
linux ×1
macos ×1
redirection ×1
sh ×1
shell-script ×1
unix ×1
wildcards ×1