GNU find output as foreign tables. Requires python 3.3+.
On an Ubuntu system, run the following:
$ sudo apt-get update
If not already installed, install PostgreSQL and required modules. Note: this FDW requires Python 3, so be sure you install the python3 version of multicorn.
$ sudo apt-get install postgresql-9.6 postgresql-9.6-python3-multicorn
Download pg_geekspeak and run the following inside the project directory
Verify all tests pass, then install.
$ sudo dpkg -i pg-gnufind_1.0.0-1_all.deb
Within PostgreSQL, install the multicorn extension, create the foreign data server, and make your tables.
-- Add the extension. This is a hard dependency. It will not work without it. CREATE EXTENSION multicorn; -- Create the foreign server. This is not a server in the traditional TCP/IP sense. This is a mapping -- between PostgreSQL's foreign data wrapper interface and any foreign tables you may create. CREATE SERVER gnufind -- This can be any name you like, but it's best to be descriptive. FOREIGN DATA WRAPPER multicorn OPTIONS (wrapper 'ttfkam.FindWrapper'); -- Searches the default python path -- Now create your table. All of these columns are optional. -- Note: "group" and "user" are quoted because they are reserved SQL words. CREATE FOREIGN TABLE gs.media_fdw ( accessed timestamptz NOT NULL, -- Last accessed (reverts to last modified if noatime is set) changed timestamptz NOT NULL, -- Last changed (reverts to last modified if noctime is set) depth smallint NOT NULL, -- Levels deep inside the search root dirname varchar, -- Just the directory portion, omitting file eperms varchar NOT NULL, -- Permissions in expanded form filename varchar, -- Just the file portion, omitting directories filesystem varchar, -- Filesystem type, e.g., ext4, zfs gid int4 NOT NULL, -- Filesystem entry group id (see: /etc/group) "group" varchar NOT NULL, -- Filesystem entry group name (see: /etc/group) hardlinks smallint NOT NULL, -- Number of hardlinks that refer to this bag o' bytes inum int8 NOT NULL, -- inode number from the filesystem modified timestamptz NOT NULL, -- Last modified path varchar NOT NULL, -- Path relative to the search root perms varchar NOT NULL, -- Permissions in octal form size bigint NOT NULL, -- Storage space used symlink character varying, -- If it's a symbolic link, where it points to type character(1) NOT NULL, -- Entry type, e.g., 'f' for file, 'd' for directory uid int4 NOT NULL, -- Filesystem entry user id (see: /etc/passwd) "user" varchar NOT NULL, -- Filesystem entry user name (see: /etc/passwd) -- Here's where it gets fun. Warning, accessing external program output hurts performance mime varchar, encoding varchar, -- Debugging. If you have a problem with WHERE clauses, I'll need this data to fix it. debug_quals text ) SERVER gnufind -- Make sure this matches your CREATE SERVER statement above OPTIONS ( -- This option is mandatory and the directory needs to exist. root_directory '/var/some/dir/to/scan/', -- This is how the mime and encoding are gathered as listed above. -- You can pass in any program as long as it returns only a single line of text. mime '/usr/bin/file -L -b --mime-type', encoding '/usr/bin/file -L -b --mime-encoding' );