Замените космос на Pipe между тэгами

Нет найти здесь, просто используйте $ file, но разверните подстановочный знак, включающий путь:

for file in folder*/*.xml ; do                                                                                       # */ fix SE highlighting bug
    grep 'sample_freq'   "$file"
    grep 'sensor_sernum' "$file"
done
2
13.10.2018, 21:51
3 ответа

Сawk:

awk -F'[:]' '/Same:/{print $0}' logfile | xargs -n1 | awk -F'=' '{print $2}' | xargs rm -rf

awkищет в лог-файле строку, содержащую ключевое слово «Same :», затем xargsупорядочивает переменные и пути (, т.е. A= ***)по одному в строке, после чего awkфиксирует абсолютный путь. На последнем шаге xargsвызывает rmдля удаления путей.

Вы должны знать, что когда xargsвызывает rmдля удаления путей, это обязательно удалит файлы. Флаг -Iможно добавить к rm, чтобы напоминать пользователю о необходимости подтверждения удаления.

рм человек

-Я запрашиваю один раз перед удалением более трех файлов или при удалении рекурсивно; менее навязчивый, чем -i, при этом обеспечивая защиту от большинства ошибок

или сgrep

grep "Same:" logfile | grep -oP '/[^ ]*' | xargs rm -rf

Первый grepнаходит строку, содержащую ключевое слово Same.

Второй grepзаполняет файл журнала, чтобы избавиться от всего, кроме путей, относящихся к ключевому слову. Наконец, xargsвызывает rmдля удаления путей.

2
27.01.2020, 21:49

Вы ДЕЙСТВИТЕЛЬНО хотите удалить все одинаковые файлы или только n -1 и оставить одну копию? Тогда почему бы и нет

awk  '/Same:/ {for (i=2; i<=NF; i++) {split ($i, T, "="); print "rm", T[2]}}' log 
rm /sdcard/A/b.txt
rm /sdcard/B/b.txt

и передать в sh, когда результат вас удовлетворит. Если вы хотите сохранить одну копию, начните цикл с i=3.

Или другой подход безawk:

echo rm $(md5sum path/to/files* | sort | uniq -Dw33 | cut -d" " -f3-)
rm file2 file4

Удалите echo, если результат вас устраивает. Если в именах файлов есть пробелы, необходимо предпринять дополнительные шаги.

2
27.01.2020, 21:49

У вас есть

$ tree
.
|-- A
|   |-- a.txt
|   |-- b.txt
|   `-- c.txt
`-- B
    |-- a.txt
    |-- b.txt
    `-- c.txt

2 directories, 6 files

Использованиеfdupes:

$ fdupes -1 A B
A/b.txt B/b.txt

fdupesобнаруживает дубликаты на основе содержимого файла. Флаг -1заставляет выводить имена файлов каждого набора дубликатов в одной строке. Здесь он обнаруживает, что файлы b.txtидентичны.

Вы можете использовать fdupesдля удаления дубликатов:

$ fdupes --delete A B
[1] A/b.txt
[2] B/b.txt

Set 1 of 1, preserve files [1 - 2, all]: 1

   [+] A/b.txt
   [-] B/b.txt

Он в интерактивном режиме спрашивает, какой файл оставить (или оба файла ). Я написал 1, поэтому файл A/b.txtбыл сохранен, а B/b.txtбыл удален.

См. руководство поfdupes(man fdupes). Если он не установлен в вашей системе, используйте менеджер пакетов для его установки. Его также можно настроить на автоматическое удаление файлов без интерактивного запроса, но при таком запуске следует соблюдать осторожность. Всегда делайте резервную копию ваших данных перед запуском команды, которая может удалить файлы.

Обратите внимание, что fdupesвсегда будет сохранять по крайней мере один из дубликатов. Если вы хотите удалить все дубликаты, вас может заинтересовать эта исправленная версия fdupes, упомянутая в ответе на аналогичный вопрос в SuperUser :https://superuser.com/a/947770/96962(. Я не проверял это ).


Причина, по которой я предлагаю использовать fdupesвместо разбора файла журнала, который у вас есть, заключается в том, что имена файлов, встроенные в текстовый документ, трудно правильно разобрать. Это может быть не всегда трудным (и в этом конкретном примере это было бы легко ), но обратите внимание, что Unix допускает как пробелы, так и символы новой строки в именах файлов и каталогов. технически возможно иметь каталог с именем

a.txt
Same: A=

с новой строкой, встроенной в имя.

9
27.01.2020, 21:49

Теги

Похожие вопросы