Найдите файлы на диске, которые соответствуют списку действительно длинного текста файлов

Необходимо посмотреть на содержание файла для различения двоичные файлы и сценарии. ls не сделает этого, это только смотрит на имена файлов и метаданные (тип, разрешение, и т.д.).

Вот сырой синтаксический анализатор для file это окрашивает сценарии и двоичные файлы по-другому. Это действует как ls -d; добавление метаданных потребовало бы временного задания, которое призывает к более прямому подходу (например, в Perl или Python); использовать lsx somedir/* перечислять содержание каталога. Имена файлов, как предполагается, не содержат новые строки, ни двоеточия (можно измениться : разделитель для некоторой другой строки с -F опция к file).

lsx () {
  file -iN -- "$@" |
  while IFS= read -r line; do
    name=${line%%: *}; type=${line#*: }
    color=0
    case $type in
      application/x-executable*) color='32';;
      text/x-shellscript*) color='01;32';;
      application/*zip*) color='31';;
    esac
    printf '\033[%sm%s\033[0m\n' "$color" "$name"
  done
}
1
08.02.2014, 05:01
4 ответа

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

sort < yourlist >yourlist_sorted 
find <absolute path to dir> -type f |sort |comm -1 -3 - yourlist_sorted

Распечатает строки Вашего файла, который не может быть найден с находкой, т.е. который не находится на Вашем диске.

Выбор которого файлы отображены, управляется командой коммуникации и первыми двумя опциями. comm управляйте, видит два файла stdin (список от находки) и Ваш список управление опциями, которые устанавливают, фильтрованы (удаленные).-1 строка фильтров только в файле 1,-2 только в строках файла 2,-3 в обоих файлах 1 и 2

Так,

  • - 2 - 3 файла Печати, которые найдены на диске а не в Вашем списке
  • - 1 - 2 файла Печати, которые найдены на диске и в Вашем списке. <==, Что Вы хотите
  • - 1 - 3 файла Печати, которые находятся только в Вашем списке а не на диске.
4
27.01.2020, 23:12

Если list.txt содержит список имен файлов (не пути) и предположение, что ни одни из имен файлов не содержат символы новой строки:

find . | awk -F/ 'NR==FNR{a[$0];next}; $NF in a' list.txt -
2
27.01.2020, 23:12

Я неправильно понял Ваш вопрос. Чтобы знать, существуют ли файлы в списке на самом деле, необходимо будет передать их имя для нахождения команды. Наивное решение состояло бы в том, чтобы выполнить итерации по списку и передать каждый объект команде находки:

IFS=''
while read i ; do
   find "$i" 2>/dev/null
   RC=$?
   if [ $RC -eq 0 ] ; then
        echo "file $i exists" >> /tmp/exists.txt
   fi
done < list.txt

Это поместит все файлы, которые существуют в файле /tmp/exists.txt.

1
27.01.2020, 23:12
  • 1
    Это не может работать с a list.txt столь большой, как обозначенный. И при этом это не будет работать с пробелами или другими специальными символами в именах файлов. –  Ricky Beam 08.02.2014, 06:38
  • 2
    я решил проблему пространства. Об обработке большого файла: разве это не зависело бы от ресурсов машины? –  mkc 08.02.2014, 06:46
  • 3
    @RickyBeam это должно работать со списком любого размера, просто потребуется долгое, долгое время. полномочия –  terdon♦ 08.02.2014, 17:01
  • 4
    Это будет теперь, смотреть на исходный ответ предредактирования... for x in $(cat large-file) не будет. (превышает оболочку макс. cmdline длина.) –  Ricky Beam 08.02.2014, 23:30

Вот иначе, просто найдите все файлы и передайте результат через grep использование -f опция заставить его считать шаблоны из файла, -w заставить его соответствовать ojnly, если шаблон является всем "словом" и -F таким образом, это не рассматривает шаблоны как регулярные выражения:

find /path/to/dir -type -f | grep -wFf list.txt

Это также предполагает, что у Вас нет новых строк в Ваших именах файлов.

1
27.01.2020, 23:12
  • 1
    . выглядит легким и простым. –  MountainX-for-Monica 08.02.2014, 18:36

Теги

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