需要grep具有特定扩展名的文件并移动到另一个文件夹

时间:2011-06-02 02:10:29

标签: bash grep

我想写一个bash命令grep所有*.txt文件,当前文件夹中的模式到另一个文件夹。我应该使用find还是for循环?我尝试使用find但似乎使事情变得复杂。

编辑:我想将具有特定模式的文件复制到其他文件夹。例如:

A.txt
B.txt
C.txt

其中都有“foo”这个词。我想要grep删除“foo”并将其发送到具有相同名称的其他文件夹。我不想以任何方式更改原始文件。

2 个答案:

答案 0 :(得分:4)

使用for可能比find更容易。像这样:

otherdir='your_other_directory'
for file in *.txt; do
    grep -q 'foo' $file && grep -v 'foo' < $file > $otherdir/$file
done

如果您的grep无法理解-q,那么:

otherdir='your_other_directory'
for file in *.txt; do
    grep 'foo' $file > /dev/null && grep -v 'foo' < $file > $otherdir/$file
done

在任何情况下,grep如果找到匹配项,则向shell返回true值,如果X && Y返回真值,则Y构造执行X命令

更新:上述解决方案假定(如Johnsyweb所述)您要删除包含“foo”的任何。如果你只是想删除“foo”而不删除整行,那么sed就是你的朋友:

otherdir='your_other_directory'
for file in *.txt; do
    grep -q 'foo' $file && sed 's/foo//g' < $file > $otherdir/$file
done

或者:

otherdir='your_other_directory'
for file in *.txt; do
    grep 'foo' $file > /dev/null && sed 's/foo//g' < $file > $otherdir/$file
done

答案 1 :(得分:2)

你可以用find来做到这一点。 (您需要sh -c才能使>重定向生效。)

find -name '*.txt' -exec sh -c 'grep -v foo {} > new/{}' \;

或者使用for循环。处理异常文件名(例如带空格的文件)时,这将更加强大。

for FILE in *.txt; do
    grep -v foo "$FILE" > "new/$FILE"
done

如果文件位于其他目录old而不是当前目录中,请使用basename删除目录:

for FILE in old/*.txt; do
    grep -v foo "$FILE" > "new/$(basename "$FILE")"
done