Текстовые файлы, содержащие их собственное имя

  1. Необходимо создать расширенный раздел в освобожденном пространстве. Расширенные разделы могут быть разделены на столько логических разделов, сколько Вам нужно.

  2. Если Вы хотите сохранить свой текущий загрузчик, да, необходимо установить загрузчик каждого дистрибутива в корень их раздела, или еще лучше, не установить один вообще. После каждой установки необходимо будет загрузиться в исходную систему и обновить личинку, таким образом, она обнаружит новые установки.

4
31.10.2014, 09:38
4 ответа
find directoryname -type f -exec grep -l {} {} \;

Это говорит найти для поиска простых файлов (т.е. исключая каталоги, устройства, символические ссылки и т.д.) и для каждого найденного файла выполнить grep с заданными параметрами. -l поручает grep просто показать имя файла, а не совпадающую строку. {} означает имя файла, \; отменяет команду.

Конечно, вы, вероятно, имели в виду, что нужно искать само имя файла, а не путь. Это означает, что часть каталога должна быть удалена из первой части {}. Одним из решений может быть:

find directoryname -type f -exec sh -c 'grep -l $(basename {}) {}' \;

Для каждого файла теперь запускается оболочка, так как подстановка параметров с $( ... ) должна быть выполнена. basenamestrips off any leading directory part.

Обратите внимание, что необходимо использовать одинарные кавычки, иначе $( ... ) часть будет вычислена при вводе команды, а не при запуске оболочки с помощью find.

1
27.01.2020, 20:49

В системе GNU вы можете сделать:

find . -type f -printf '%f\0%p\0' | xargs -r0n2 grep -lFe

( ( --тип f - это только для регулярных файлов . Изменить на -xtype f Если вы также хотите рассмотреть SymLinks для обычных файлов).

1
27.01.2020, 20:49

: это сработало:

find /path/ -type f -exec sh -c "grep -l \"\$(basename {})\" {}" \;

Explanation:
  • -тип f: найти только файлы
  • sh -c: выполнить оболочку для каждого файла
  • grep -l: показать только имена файлов
  • \$(basename {}): выполнить оболочку для каждого файла
  • grep -l: показать только имена файлов
  • \$(basename {}): grep для basename
0
27.01.2020, 20:49

Чтобы быть максимально переносимым и работать, когда имена файлов могут включать пробелы или другие символы из IFS, а также на системах, где find не обрабатывает {} внутри кавычек, используйте find -exec в комбинации с sh и обычным передачей параметров:

find DIRECTORY -type f -exec sh -c 'grep -lFe "$(basename "$1")" "$1"' sh {} ';'

find DIRECTORY -type f перечисляет все обычные файлы в рамках DIRECTORY рекурсивно. -exec ... ';' выполняет команду для каждого найденного файла. Его суть - команда sh до {}, которая:

  • Выполняет стандартную оболочку с помощью скрипта командной строки grep -lFe "$(basename "$1")" "$1" для каждого найденного файла, который совпадает, и который:
    • находит базовое имя соответствующего файла ($1), используя подстановку команды и basename - и подстановка команды, и переменная кавычки для учета тех случаев, когда они могут содержать пробелы или подстановочные знаки; и
    • greps совпадающего файла (все еще "$1") для этого базового имени, используя -l для печати только имени совпадающего файла. "$1" снова цитируется для учета пустых строк или подстановочных символов.
  • И передает в двух аргументах sh: "sh" и {}. sh предназначен для встроенного скрипта $0 (имя выполняющейся программы, которую оболочка использует, например, для сообщения об ошибках). find заменит аргумент, состоящий точно из {} на совпадающее имя файла, так что сам скрипт sh получит единственный аргумент, полный путь к файлу которого доступен в виде $1.

Это будет работать на любой POSIX-совместимой системе. Использование {} внутри цитируемой строки с find -exec имеет поведение, определяемое реализацией, и поэтому не переносится (хотя поддерживается GNU grep и большинством BSD) и опасно, так как имя файла интерпретируется как код оболочки .

Произвольные имена файлов всегда нуждаются в кавычках, если они могут содержать пробелы, символы подстановки или неизвестно значение переменной разделителя входных полей IFS; в противном случае они будут разбиты на несколько слов и заставят программу вести себя неожиданно.


Более эффективно можно использовать find -exec с помощью + для запуска минимально возможного количества оболочек:

find DIRECTORY -type f -exec sh -c 'for x in "$@" ; do grep -lFe "$(basename "$x")" "$x" ; done' sh {} '+'

Это все еще портативно, но предоставляет множество файловых путей к каждому выполнению sh, так что запускается не так много оболочек. Внутри оболочки программы находится цикл for, который смотрит на каждый из файлов. Если это то, что будет выполняться часто, то это лучший вариант, чем использовать ";" для завершения команды.

6
27.01.2020, 20:49

Теги

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