Нужно grep файл с определенным расширением и переместить в другую папку - PullRequest
2 голосов
/ 02 июня 2011

Я хочу написать bash команду, которая grep s все *.txt файл с шаблоном в текущей папке в другую папку. Должен ли я использовать find или for цикл? Я пытался использовать find, но это, кажется, усложняет ситуацию.

Редактировать : Я хочу скопировать файлы с определенным рисунком в другую папку. Например:

A.txt
B.txt
C.txt

у всех есть слово "foo". Я хочу, чтобы grep удалил «foo» и отправил его в другую папку с тем же именем. Я не хочу менять исходный файл.

Ответы [ 2 ]

4 голосов
/ 02 июня 2011

Использование 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 возвращает истинное значение в оболочкуесли он находит совпадение и конструкция X && Y выполняет команду Y, если X возвращает истинное значение.

ОБНОВЛЕНИЕ : Предполагается, что в приведенном выше решении (как отметил Джонсон)что вы хотите удалить любые строки , которые содержат "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
2 голосов
/ 02 июня 2011

Вы можете сделать это с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...