grep -v [字符串] 整个文件夹

grep -v [字符串] 整个文件夹

我有一个文件夹/path/,其中文件全部格式化为.filetype,我希望执行:

grep -v [string] [filename] > [filename copy].filetype

对于此文件夹中的所有项目。我想我必须做cd /path.并设置一个循环。我真的不熟悉语法,而且我不想弄乱任何东西,它的格式会是这样的吗:

for [something] in *.filetype
do
  grep -v [string] [filename] > "[filename].filetype"
done

??

如果有帮助,我的文件没有以特定方式格式化**(例如按时间或日期),因此顺序并不重要,但我非常需要保留文件名。不确定这是否可能

预先感谢,抱歉,如果我让您头痛。

编辑:**

我的意思是说我的文件没有特定的组织方式。

答案1

你可以做:

(cd /path && grep -vFe 'string' -- /dev/null *.filetype) > result.filetype

添加/dev/null可确保匹配的行以文件路径为前缀,即使只有一个*.filetype文件也是如此。通过 GNU 实现grep,您还可以使用该-H选项。

result.filetype在当前工作目录中创建 ,而其他文件则在/path.为了与模式result.filetype匹配*.filetype,您需要确保它不是从内部运行/path,否则您可能会遇到一些无限循环,最终填满磁盘。

要递归查找*.filetype文件,您可以使用find

(
  cd /path &&
    LC_ALL=C find . -name '*.filetype' -type f -exec \
      grep -vFe 'string' -- /dev/null {} +
) > result.filetype

或者使用 GNU 实现grep

(
  cd /path &&
    LC_ALL=C grep -r --include='*.filetype' -vFe 'string' .
) > result.filetype

(请注意,它还会考虑隐藏文件)。

或与zsh

(cd /path && grep -vFe 'string' -- /dev/null **/*.filetype(.)) > result.filetype

答案2

这应该有帮助:

for f in *
do
  grep -v [string] "$f" > "new_$f"
done

相关内容