У меня есть список имен файлов в формате .txt из двух разных каталогов. Они поступают из базы данных сервера и имеют единую характеристику (флаг базы данных), но мне действительно нужно знать, из какого из 2 каталогов они происходят.
Есть ли способ пакетной обработки списка для создания нового списка, который показывает, из какого каталога пришел файл?
Я могу сделать это один за другим, используя «поиск», но в списке около 150 файлы.
Быстрее ли читать о запросах к базе данных и переделывать список самостоятельно?
Вы могли всегда использовать locate
команда, которая читает базу данных всех файлов. База данных должна быть обновлена перед выполнением locate
,как бы то ни было.
Вот пример того, что можно было бы сделать
$ locate --regex ".*/lightdm.conf$"
/etc/init/lightdm.conf
/etc/lightdm/lightdm.conf
Теперь, к пакетной обработке список файлов, можно было использовать while read do. . . done < input_file
структура, с locate
код внутри. Что-то вроде этого:
$> cat > file_list.txt
passwd
lightdm.conf
firefox.desktop
$> while read line ; do
> locate --regex ".*/$line$"
> done < file_list.txt
/etc/passwd
/etc/cron.daily/passwd
/etc/pam.d/passwd
/home/xieerqi/Desktop/cleanup/passwd
/home/xieerqi/Documents/passwd
/usr/bin/passwd
/usr/share/bash-completion/completions/passwd
/usr/share/doc/passwd
/usr/share/lintian/overrides/passwd
/etc/init/lightdm.conf
/etc/lightdm/lightdm.conf
/usr/share/applications/firefox.desktop
Конечно, это не является самым быстрым из поисков - после того, как вся база данных будет содержать тысячи файлов, но намного более быстрый, чем пересечение всей структуры каталогов с find
Если Вы знаете, что файлы могут только быть в одном из двух мест, то, вероятно, более эффективно протестировать каждого явно, например,
while IFS= read -r f; do
if [ -e "dir1/$f" ]; then
echo "dir1/$f"
elif [ -e "dir2/$f" ]; then
echo "dir2/$f"
else
echo "$f: not found"
fi
done < filelist
reset
(в этом случае gsettings reset org.gnome.desktop.wm.preferences button-layout
).
– pomsky
6 November 2018 в 04:14