这个问题的灵感来自
我看到这些结构
for file in `find . -type f -name ...`; do smth with ${file}; done
Run Code Online (Sandbox Code Playgroud)
和
for dir in $(find . -type d -name ...); do smth with ${dir}; done
Run Code Online (Sandbox Code Playgroud)
几乎每天都在这里使用,即使有些人花时间对这些帖子发表评论,解释为什么应该避免这种东西......
看到此类帖子的数量(以及有时这些评论被简单地忽略的事实)我想我还不如问一个问题:
为什么循环find的输出是不好的做法,为 返回的每个文件名/路径运行一个或多个命令的正确方法是find什么?
我发现自己几乎每天都在做以下事情
find -name somefile.txt)vim 问题是我必须将结果复制并粘贴find到vim命令中。有什么办法可以避免这样做吗?我尝试了一些 ( find -name somefile.txt | vim) 但没有找到任何有效的方法。
提前致谢
我有一个相对较小的文件名列表,这些文件名是从基于find. 文件名包含空格和标点符号,但绝对没有其他非打印字符或换行符。
例如,
Netherlands/Purge (GDPR) 2020-01-09.txt
Netherlands/Purge (GDPR) 2020-01-27.txt
Switzerland/New mailing 2020-01-27.txt
Run Code Online (Sandbox Code Playgroud)
我想将这些文件作为一组(vi file1 file2 file3而不是vi file1; vi file2; vi file3)进行编辑,部分原因是我可以轻松地在它们之间前后跳转。
我已经开始使用生成的文件名列表作为参数列表 - 带有空格
,它有一个标准的find -print0 | xargs -0 mycommand解决方案。不幸的是,这在mycommand编辑器时不起作用,因为虽然xargs可以组合要编辑的文件集,但标准输入已经从管道中占用,我看不到就地运行编辑器的方法。我无法使用,find -exec vi {} +因为我正在使用管道来验证文件名集,而不仅仅是find它本身。
我的另一个选择是复制和粘贴,组合文件名列表,用引号将它们括起来,然后在结果前加上vi. 对于这三个文件来说,这是微不足道的,但在一般情况下,这不是一个易于重用的解决方案,
vi 'Netherlands/Purge (GDPR) 2020-01-09.txt' 'Netherlands/Purge (GDPR) 2020-01-27.txt' 'Switzerland/New mailing 2020-01-27.txt'
Run Code Online (Sandbox Code Playgroud)
给定一个 GNU/Linux 平台bash作为我的首选 shell(以防万一),我如何编辑类似生成的文件列表?
基于此脚本:
find . -name "*.txt" | grep 'LINUX/UNIX'
Run Code Online (Sandbox Code Playgroud)
和
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Run Code Online (Sandbox Code Playgroud)
从这里 ,我可以 grep 某个字符串的文件,然后将这些文件复制到一个目录中,如果它们包含该字符串,但它们会被保存为单独的文件。如何将这些文件归类为一个连贯的文档?
示例 我的想法如下:我有一个引用档案,分布在数百个文件夹中的单独文件中,文件夹的名称是各自的主题。所以“哲学/本体论/概念/aletheia/notes.tex”将包含我所有关于aletheia等哲学概念的笔记。
它们都遵循一些命名约定(名称始终为:notes.tex),因此对它们进行 grep 很容易。我可以通过 grep 搜索它们,但我希望能够有一个脚本,它不仅可以找到它们,还可以将包含相应字符串的所有文件连接到一个大文件中。