我想写一个bash
命令grep
所有*.txt
文件,当前文件夹中的模式到另一个文件夹。我应该使用find
还是for
循环?我尝试使用find
但似乎使事情变得复杂。
编辑:我想将具有特定模式的文件复制到其他文件夹。例如:
A.txt
B.txt
C.txt
其中都有“foo”这个词。我想要grep删除“foo”并将其发送到具有相同名称的其他文件夹。我不想以任何方式更改原始文件。
答案 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