Необходимо посмотреть на содержание файла для различения двоичные файлы и сценарии. 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
}
Давайте предположим, что Ваши имена файлов являются полными путями, и все файлы находятся в одном каталоге, и Вы хотите найти только файлы (не каталоги, специальные файлы, и т.д.), и у Вас нет пробелов или специальных символов в Ваших именах файлов.
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
Так,
Если list.txt
содержит список имен файлов (не пути) и предположение, что ни одни из имен файлов не содержат символы новой строки:
find . | awk -F/ 'NR==FNR{a[$0];next}; $NF in a' list.txt -
Я неправильно понял Ваш вопрос. Чтобы знать, существуют ли файлы в списке на самом деле, необходимо будет передать их имя для нахождения команды. Наивное решение состояло бы в том, чтобы выполнить итерации по списку и передать каждый объект команде находки:
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
.
list.txt
столь большой, как обозначенный. И при этом это не будет работать с пробелами или другими специальными символами в именах файлов.
– Ricky Beam
08.02.2014, 06:38
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
Это также предполагает, что у Вас нет новых строк в Ваших именах файлов.