オペレーティングシステム: 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
が現在のディレクトリの内側または下にあるとします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