操作系统: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