web-dev-qa-db-ja.com

別のディレクトリにある重複ファイル(fdupesで識別)の名前を変更するより速い方法はありますか?

ジャーナル記事のPDFファイルでいっぱいのディレクトリがあります。そのほとんどはbibtexキーで名前が付けられています。少し前に外付けハードドライブにバックアップを作成しましたが、最新の状態に保たれておらず、異なる名前の重複がたくさんあります。 2つのディレクトリを同期に戻し、余分なファイルを削除したいと思います。

Fdupesを使用して、これらの束を識別しました。これで、それらのペアのリストができました。ただし、外付けドライブの重複のほとんどには意味のない名前が付いています。それらの数が非常に多いため、削除して再度コピーするのではなく、最初のディレクトリの複製と同じ名前に変更したいと思います。だから私はrsyncだけを使いたくありません。

たとえば、fdupesの出力が次の場合:

/home/articles/bibtex.pdf
/external/articles/morearticles44.pdf

書くよりも速い方法はありますか

mv /external/articles/morearticles44.pdf /external/articles/bibtex.pdf

重複の各ペアに対して?

4
user3035900

私の経験では、fdupesはファイルを出力する順序に一貫性がない可能性があります(--deleteオプションを使用すると独自の問題が発生しました)。これは、ファイルを特定の順序にする必要がないため、かなり堅牢である必要があります(異なるフォルダーに常に2つの複製がある場合)。

# note no trailing slash
source_dir=/home/articles
target_dir=/external/articles

fdupes "$target_dir" "$source_dir" |
  while IFS= read file; do
    case "$file" in
      "$source_dir/"*)
         source=${file##*/}
         ;;
      "$target_dir/"*)
         target=$file
         ;;
      '')
         if [ "$source" ] && [ "$target" ]; then
           echo mv -i "$target" "$target_dir/$source"
         fi
         unset source target
         ;;
    esac
  done

これにより、mvコマンドが出力され、必要なものが確実に揃ったらechoが削除されます。また、mv-iオプションは、何かを上書きするかどうかを確認するメッセージを表示します。

1
Graeme

別のワークフローを提案します( hasenjが提案 ):fdupesを使用して重複ファイルを識別し、後処理を実行してそれらを削除する代わりに、 nison 重複を識別して処理します。

ルートリモートの1つでUnisonを実行する必要があります。そうしないと、同一のファイルが検出されません。だから実行

unison /home/articles/bibtex.pdf ssh://localhost/external/articles

ユニゾンはしばらくの間解約し、2つのツリーを同期することを提案します。 >方向に同期して/external/articles/morearticles44.pdf/external/articles/bibtex.pdfに移動することを選択します。