通过管道 sql 查询查找命令

通过管道 sql 查询查找命令

操作系统:RockyLinux 8.5

这个命令效果非常好:

sqlite3 files.db "select file from A;" | rsync -R -av --files-from=/dev/stdin /SOURCE /DESTINATION/Out

没有管道的结果:

sqlite3 files.db "select file from A;"

file1.txt
file2.txt
file3.txt

我正在尝试使用相同的方法,但通过管道传输到 find 命令。

sqlite3 files.db "select file from A;" | find -type f -name /dev/sdin

它不返回任何值。

答案1

您的find命令在当前目录中查找,并向下查找任何其他子目录中名为 的文件 ( -type f) /dev/stdin

find -type f -name /dev/stdin

它不读取或使用标准输入根本不。它也将无法匹配任何内容,因为/dev/stdin这是一个不可能的文件名(文件名字不能包含/)。 GNU find(至少)返回此警告:

find: warning: '-name' 仅与基本名称匹配,但给定的模式包含目录分隔符 ('/'),​​因此表达式将始终计算为 false。您指的是“-全名”吗?

如果要用于find确定 SQL 查询返回的名称集的路径名,则必须遍历该集,并希望所有文件名都不包含换行符。这是实现此目的的一种方法:

sqlite3 files.db "select file from A;" |
    while IFS= read -r file
    do
        find -type f -name "$file"
    done

示例场景。假设当前目录中或下的某个位置至少存在三个命名示例文件p.c, sc,之一:args

sqlite3 files.db <<'EOF'
create table A ( file char(255) not null );
insert into A values ('p.c');
insert into A values ('sc');
insert into A values ('args');
EOF

sqlite3 files.db "select file from A;" |
    while IFS= read -r file; do find -type f -name "$file"; done

./p.c
./sc
./bin/sc
./chroot/bin/args
./bin/args

相关内容