Нет найти
здесь, просто используйте $ file, но разверните подстановочный знак, включающий путь:
for file in folder*/*.xml ; do # */ fix SE highlighting bug
grep 'sample_freq' "$file"
grep 'sensor_sernum' "$file"
done
С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
для удаления путей.
Вы ДЕЙСТВИТЕЛЬНО хотите удалить все одинаковые файлы или только 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
, если результат вас устраивает. Если в именах файлов есть пробелы, необходимо предпринять дополнительные шаги.
У вас есть
$ 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=
с новой строкой, встроенной в имя.