検索を使用してリストを比較するには?

検索を使用してリストを比較するには?

私はこれを行い、多くの重複バックアップファイルを削除したいファイルのリストを得ました。

find . -type f -name '._*' 

そのファイル名のファイルを探したい

  • /home/masi/._test.texマッチ/home/masi/test.tex
  • /home/masi/math/lorem.pngマッチ/home/masi/math/._lorem.png

保存するファイルの疑似コードに対応するfilenameものがありますが、保存されませ._filenamefilename._filename

find . -type f -name '._*' -exec \ 
   find filenameWithoutDotUnderscore, if yes, print the filename

疑似コード 2 削除するファイルの説明 = 対応するファイルが存在するか._filenameどうかfilename

  • とが同じディレクトリに存在する場合は、filename重複した=を削除できるように印刷します。._filename._filename._filename
  • filenamePart1_.filenamePart2、、...bok_3A.pdfにあるものを除きます。._filename
  • 同じディレクトリにそのエントリがない場合は ._filename削除しないでください。filename

ワイルドカードを確認するコマンド

これを行いましたが、あまりにもfind . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +多くのファイルが返されました。&&存在確認に加えて、条件()がさらに必要なようです[ -e "$f" ]。大きな違いがあると思われる場合は、ここでいくつかの内容を比較し、最後に比較することをお勧めします。

システム:Ubuntu 16.04とDebian 8.25
Bash:4.3.42
検索:4.7.0

ベストアンサー1

を使用してこれを行うことができますが、findこれを強力にするには、シェルシングルライナーも含める必要があります。これを行う正しい方法は次のいずれかです。

結果シェルにループを埋めます。

find . -type f -name '._*' -exec sh -c 'for a in "$@"; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf %s\\n "$f"; done' find-sh {} +

または、テストするファイルごとに別々のシェルを作成します(非効率的ですが、潜在的に読みやすくなります)。

find . -type f -name '._*' -exec sh -c 'f="${1%/*}/${1##*/._}"; [ -e "$f" ] && printf %s\\n "$f"' find-sh {} \;

バックアップファイルを直接削除するには、次のように変更します。テスト実行:

find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && printf "rm -- %s\n" "$a"; done' find-sh {} +

それから一度満足すれば印刷されたコマンドのリストを表示するには、次のようにします。

find . -type f -name '._*' -exec sh -c 'for a; do f="${a%/*}/${a##*/._}"; [ -e "$f" ] && rm -- "$a"; done' find-sh {} +

メモ:

これらのすべてでは、パラメータはランダムなfind-sh文字列です。ここに何でも入れることができます。これは$0生成されたシェルに設定され、エラー報告に使用されます。

for a in "$@"; doと全く同じですfor a; do

printf比較するecho

引用は重要です。

おすすめ記事