パイプライン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 と評価されます。 「-フルネーム」という意味ですか?

これを使用してSQLクエリから返された名前セットのパス名を解決するには、そのセットをfind繰り返し、すべてのファイル名に改行文字が含まれていないことを願っています。これを達成する1つの方法は次のとおりです。

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

例のシナリオ。 3つ以上の名前付きサンプルファイルの1つp.cが現在のディレクトリの内側または下にあるとしますscargs

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

関連情報