удалять файлы на основе diff двух текстовых файлов

Я создал два .txt-файла, которые выглядят так:

5fba026dcf271c6fa174b9fc2fc1fefadf1370f9 ./.changeFiles/change/addImage1.change bb352fba5807f4d03ea11abb00e411b00ce38673 ./.changeFiles/change/addImage2.change 999eea42e4e72431695815456a3ac16796df5eed ./.changeFiles/change/addSurface1.change 

Один из них – список всех файлов, которые заканчиваются на .change или .tstwf в данном каталоге, а другой – отсортированная версия этого списка с дублирующимися записями (на основе shasum).

Когда я использую colordiff -u в двух файлах, все изменения – это файлы, которые я хочу удалить. Есть сотни файлов, которые нужно удалить, и я бы предпочел не делать это вручную …

Поэтому мой вопрос: как удалить файлы из каталога, которые не включены в файл sorted.txt и отображаться в diff?

Edit1:

workflows.txt (исходный файл):

 23ded53098d5d233c0a54af482542ba7a42860d3 ./encryption/AFPtoPDFwEncryption.tstwf 24a37e00de73a58736be1aee56d4b073e75a994f ./workflows-from-will/workflow/AFPtoPDF.tstwf 2532934d268bb6eddc6a018e3469b0a53a794e10 ./workflows-from-will/workflow/change/table.without.emptycells.rotation.270.mark-content.change 264a08fef59d9b9c18a857e2532f0b7b5a92c60b ./pageModification/AFPtoPDFwFillRectMod1.tstwf 2680a37bb22512bf3119e3991bb2c814cb23fb77 ./workflows-from-will/workflow/AFPtoPDFwHyperlinks.tstwf 268635261e91a4caf1a09979ffdb8163d4d22c8a ./AFPmicr.tstwf 268635261e91a4caf1a09979ffdb8163d4d22c8a ./workflows-from-will/eds-0923/AFPmicr.tstwf 

workflows-sorted.txt (список всех файлов этого типа будет сохранен):

 0bdbcbed279e2df9149de319253609f11b19d689 ./textModification/AFPtoPDFwReplaceTextMod2.tstwf 0d0ebfb8d519ff84e3dd86771d067bdeea835df6 ./pageModification/AFPtoPDFwSoftClipMod1.tstwf 0dcafe876ea8574619664920ec5b1fdbff3ca218 ./workflows-from-will/AFPtoPDF_CE003A01.tstwf 0e55506bf5d7694d8cda9467a5809ea75c486fb1 ./workflows-from-will/workflow/change/pdf.change 0ec03992e19a12520f131f89cd9060c2e4ba2be2 ./workflows-from-will/AFPNOPIndexCallback.tstwf 0f1dca3e5d9b17f11c194b250096fc15891b9998 ./stapling/AFPtoPDFwStapling1.tstwf 

Кроме того, еще в моем исследовании я столкнулся с командой «comm», похоже, что это можно использовать для изоляции файлов, которые я хочу удалить.

3 Solutions collect form web for “удалять файлы на основе diff двух текстовых файлов”

Поэтому вы хотите удалить файлы, перечисленные в файле workflows.txt , за исключением тех, которые перечислены в workflows-sorted.txt . Вы можете получить список файлов, удалив контрольные суммы, отсортировав имена и выполняемые команды, чтобы извлечь строки, которые присутствуют только в workflows.txt . В оболочке, поддерживающей замещение процесса (ksh93, bash, zsh):

 comm -23 <(<workflows.txt sed 's/^[^ ]*[ ][ ]*//' | sort) \ <(workflows-sorted.txt sed 's/^[^ ]*[ ][ ]*//' | sort) 

comm -23 удаляет строки, которые присутствуют только во втором аргументе ( -2 ), и строки, которые присутствуют в обоих файлах ( -3 ), тем самым сохраняя только строки, которые присутствуют в первом аргументе, но не второй аргумент. Имейте в виду, что comm требует сортировки входных файлов.

Чтобы удалить их:

 comm -23 <(<workflows.txt sed 's/^[^ ]*[ ][ ]*//' | sort) \ <(workflows-sorted.txt sed 's/^[^ ]*[ ][ ]*//' | sort) | xargs -I rm -- {} 

Вы можете сделать последнюю строку xargs rm чтобы идти немного быстрее (группируя вызовы на rm ), если имена файлов не содержат пробелов или \'" . В качестве альтернативы вы можете сделать последнюю строку tr '\n' '\0' | xargs -0 rm -- or xargs -d '\n' rm -- если ваши xargs поддерживают эти параметры. Вам не нужно -- если все имена ваших файлов начинаются с / или ./ (или что-либо, что не гарантировано для начала - ).

Если в ваших именах нет пробелов, это должно дать вам список повторяющихся файлов, которые вы хотите удалить:

 awk 'c[$1]++' workflows.txt > erasefiles.txt 

Тогда это просто вопрос стирания всех из них (сначала используйте эхо, пока не убедитесь, что это именно то, что вам нужно) (в bash):

 rm $(awk '{print $2}' erasefiles.txt) 

Если ваши файлы могут иметь пробелы (или другие нечетные символы, кроме новой строки – \n и нуль \0 ):

 awk '{$1=""; print}' erasefiles.txt | tr '\n' '\0' | xargs -0 -r rm -- 

Для одноразового задания я начинал с вывода diff и редактировал его в список удаляемых файлов (если он был скучен, оставьте эту задачу sed(1) , скрипт Perl или некоторые из них). После двойной проверки списка запустите его, например, ( bash(1) !):

 rm $(< list-of-files-to-axe) 

Может быть сезон с -f или -i флажками по вкусу.

Автоматизировать это будет намного больше работы (и ввести слишком много gotchas), чтобы стоить это для случайного использования. Для повторного использования напишите все это на языке сценариев, например Perl или Python. Держитесь подальше от специальных языков, таких как awk(1) .

  • Как переместить строку из файла в другой файл на основе сопоставления с образцом?
  • Как найти позицию персонажа с помощью grep?
  • Что означает выражение Grep?
  • как совместить точный субдомен с grep, игнорируя другие
  • bash - почему \ x0d \ x20 стирает строку
  • grep и отдельный вывод на две колонки
  • Bash-completion и grep
  • Поиск строки во многих файлах на HP-UX
  • test, если return true, если grep на выходе имеет строку в одной строке
  • разница между. * и * в регулярном выражении
  • Как я могу перечислить каждый файл в каталоге, кроме тех, у которых указаны указанные расширения?
  • Linux и Unix - лучшая ОС в мире.