Используйте grep, чтобы найти содержимое в файлах и переместить их, если они совпадают

Я использую grep для создания списка файлов, которые мне нужно переместить:

grep -L -r 'Subject: \[SPAM\]' .

Как передать этот список команде mv и переместить файлы в другое место?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
62
0
66 457
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Вы можете передать результат следующей команде, используя grep ... | xargs mv {} пункт назначения

Проверьте man xargs для получения дополнительной информации.

Есть несколько способов, но вот медленный, но надежный:

IFS=$'\n'; # set the field separator to line break
for $mail in $(grep -L -r 'Subject: \[SPAM\]' .); do mv "$mail" your_dir; done;
IFS=' '; # restore FS
Ответ принят как подходящий

Если вы хотите найти и переместить файлы, которые не соответствуют вашему шаблону (переместить файлы, которые не содержат 'Subject \[SPAM\]' в этом примере), используйте:

grep -L -Z -r 'Subject: \[SPAM\]' . | xargs -0 -I{} mv {} DIR

-Z означает вывод с нулями (\ 0) после имен файлов (поэтому пробелы не используются в качестве разделителей).

xargs -0

означает интерпретировать \ 0 как разделители.

-L означает поиск файлов, не соответствующих шаблону. Замените -L на -l, если вы хотите переместить файлы, соответствующие вашему шаблону.

потом

-I{} mv {} DIR

означает заменить {} на имена файлов, так что вы получите mv filenames DIR.

Спасибо, заглавная - я должен писать строчные буквы на моих xargs

user17582 18.09.2008 16:49

В моих xargs -i устарел. Но у sandrv может быть более старая версия (например, YMMV).

gbarry 08.07.2009 11:24

Разве это не должно быть -l вместо -L?

TopQ 13.01.2012 20:25

Я думаю, что спрашивающий пытался найти файлы без темы [СПАМ] и переместить их, так что ответ, сохраняющий это, правильный. да, хотя ... -l, вероятно, имеет смысл по умолчанию.

Pricey 14.10.2013 14:02

Эта альтернатива работает там, где аргументы недоступны:

grep -L -r 'Subject: \[SPAM\]' . | while read f; do mv "$f" out; done

Вот что я использую в Fedora Core 12:

grep -l 'Subject: \[SPAM\]' | xargs -I '{}' mv '{}' DIR

Возможно, это сработает:

mv $(grep -l 'Subject: \[SPAM\]' | awk -F ':' '{print }') your_file

Идеальная работа для меня:

  • переместите файлы, содержащие текст со словом MYSTRINGTOSEARCH, в каталог MYDIR.

    найти . -type f -exec grep -il 'MYSTRINGTOSEARCH' {} \; -exec mv {} MYDIR / \;

надеюсь, это поможет

Вот что мне помогло:

grep -lir 'spam' ./ | xargs mv -t ../spam

Конечно, я уже был в нужной папке (поэтому ./) и переместил их в соседнюю папку. Но вы можете изменить их на любые пути.

Я не знаю, почему принятый ответ не сработал. Также у меня не было пробелов и специальных символов в именах файлов - возможно, это не сработает.

Здесь украли: Команда grep для поиска файлов, содержащих текстовую строку, и их перемещения

mv `grep -L -r 'Subject: \[SPAM\]' .` <directory_path>

Предполагая, что написанная вами команда grep возвращает ожидаемые пути к файлам.

Другие вопросы по теме