파이프라인 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해당 집합을 반복하고 모든 파일 이름에 개행 문자가 포함되지 않기를 바랍니다. 이를 달성하는 한 가지 방법은 다음과 같습니다.

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

관련 정보