web-dev-qa-db-ja.com

Recollクエリの結果をフォルダーに移動するにはどうすればよいですか?

Recollから一致するファイルを送信できるかどうか(複数のファイル.pdf .docなどのコンテンツ内の単語または文字列を検索)をフォルダに送信できるかどうかを知りたいです。

ありがとう!

4
Lucarolina

コマンドライン検索 を使用できます:

recoll -t "yourquery" 

そして、それをフィルタリングしてファイル名のリストを取得します。たとえば(きっとあなたはもっときちんと安全にそれを行うことができます):

[:~/tmp/lalla/out] % files=$(recoll -t "x11vnc" | awk '{print $2}' | grep file:/// | sed 's+\[file://++' | sed 's/]$//')
[:~/tmp/lalla/out] % echo $files    
/home/romano/personal/archivio/Tricks/remote-ubuntu-login.txt
/home/romano/lib/Jed_Backups/remote-ubuntu-login.txt
/home/romano/software/documentation/Ubuntu:Maverick.html
/home/romano/personal/library/Unknown/Ubuntu_Maverick
/home/romano/.wajig/romano-asus/Available.prv
/home/romano/.wajig/romano-asus/Available
/home/romano/.wajig/asus-romano/Available.prv
/home/romano/.wajig/asus-romano/Available

そしてそれらを使用します:

 cp $files my-new-dir/

複雑なパイプを理解するために、recoll -tは次のように出力します。

8 results
text/plain  [file:///home/romano/personal/archivio/Tricks/remote-ubuntu-login.txt]  [remote-ubuntu-login.txt]   322 bytes
  1. 最初のawkは、2番目の(スペースで区切られた)アイテムだけを出力します(そしてwillは、ファイル名にスペースがある場合、混乱を招きます。私は考えます);
  2. grepは、「file:///」が含まれる行のみを選択します
  3. 最初のsedは、先頭の[file://を削除します(区切り文字として+を使用していることに注意してください)
  4. 2番目のsedは末尾の]を取り除きます

おそらく正しい方法は、 recoll python bindings を使用してpythonプログラムを書くことです。

3
Rmano

Bashスクリプトソリューション

@Rmanoは私を打ち負かしましたが、さまざまなソリューションを用意することは常に良いことだと思います。これが私が作成したスクリプトです。

#!/bin/bash

# NAME:         recoll_move_results
# VERSION:      0.1
# AUTHOR:       (c) 2014 Glutanimate
# DESCRIPTION:  queries recoll database for provided string and either symlinks or moves
#               results
# DEPENDENCIES: recoll
#
# LICENSE:      GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html)
#
# NOTICE:       THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 
#               EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 
#               PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR 
#               IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
#               AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND 
#               PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
#               YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
#
#               IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY 
#               COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS 
#               PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, 
#               INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE 
#               THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED 
#               INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE 
#               PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER 
#               PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
#
# USAGE:        recoll_move_results <query>

# VARIABLES / SETINGS

DESTINATION="$HOME/recollresults" # ⇐ Set the destination folder here

QUERY="$@"
USAGE="$0 <query>"

if [[ -z "$QUERY" ]]
  then
      echo "Error: No arguments provided."
      echo "Usage: $USAGE"
      exit 1
fi

# create destination folder
mkdir -p "$DESTINATION"

# FUNCTIONS

# query recoll and convert URIs to file paths
recoll_get_results(){
    recoll -t -b "$QUERY" 2> /dev/null | sed 's,file://,,g'
}

# symlink or move files read from stdin
move_files(){
    while read -r FILE; do
      echo "Processing $FILE"
      FILENAME="${FILE##*/}"
      # PLEASE USE ONLY ONE OF THE OPTIONS BELOW. COMMENT THE ONE YOU DON'T WANT
      # AND UNCOMMENT THE ONE YOU DO WANT
      ln -sv "$FILE" "$DESTINATION/$FILENAME" # Create a symbolic link in $DESTINATION
      #mv -v "$FILE" "$DESTINATION/$FILENAME" # Move to $DESTINATION
    done
}

# MAIN

recoll_get_results "$QUERY" | move_files

使用方法

次のスクリプトを使用します。

 recoll_move_results <query>

提供されたクエリとシンボリックリンクを実行するか、すべての検索結果を新しく作成されたフォルダーに移動します。スペースと特殊文字(改行を除く)は、スクリプトで正しく処理する必要があります。


設定

カスタマイズできる設定は次のとおりです。

  • DESTINATION="$HOME/recollresults"-これを変更して宛先フォルダを設定します
  • ln -sv "$FILE" "$DESTINATION/$FILENAME"-この行にコメントを付けます(#)ファイルへのシンボリックリンクを作成するのではなく、ファイルを移動する場合は、次のコメントを外します

結果を移動すると、インデックスを再度更新するまで、Recollの検索インターフェイスからファイルにアクセスできなくなることに注意してください。

別のオプションは、以下を置き換えることによりファイルをコピーすることです:

`ln -sv "$FILE" "$DESTINATION/$FILENAME"`

`cp -v "$FILE" "$DESTINATION/$FILENAME"`
0
Glutanimate