ファイルを比較し、より大きなファイルを選択してください。

ファイルを比較し、より大きなファイルを選択してください。

多くのファイルを含む2つのディレクトリがあります。これらのファイルの名前は常に一致しますが、サイズは常に一致しません。たとえば、

/dir1
|-file1 (1 MB)
|-file2 (2 MB)
|-file3 (3 MB)

/dir2
|-file1 (1 KB)
|-file2 (2 MB)
|-file3 (10 MB)

ご覧のとおり、ファイル名は一致しますが、ファイルサイズはfile2でのみ一致します。これら2つのディレクトリのファイルを比較し、より大きなファイルのみを選択するにはどうすればよいですか?例の出力は「/dir2/file3」でなければなりません。

dir1 のファイルが dir2 の同じ名前のファイルより大きい場合、何もしません。私はdir1のファイルより大きいdir2のファイルだけに興味があります。

スクリプトを作成したがdir2に大きなファイルがある場合にのみ機能します。

#!/bin/bash
diff -q $1 $2 | awk '{ print $2,$4 }' > tempfile.txt
A=`cat tempfile.txt | cut -d ' ' -f 1`
B=`ls -s $A | cut -d ' ' -f 1`
C=`cat tempfile.txt | cut -d ' ' -f 2`
D=`ls -s $C | cut -d ' ' -f 1`
if [ "$D" -gt "$B" ]; then
 echo $C
fi

ベストアンサー1

#!/usr/bin/env zsh

zmodload -F zsh/stat b:zstat

for file2 in dir2/*(.); do
    file1="dir1/${file2##*/}"

    if [ -f "$file1" ] &&
       [ "$( zstat +size "$file2" )" -gt "$( zstat +size "$file1" )" ]
    then
        printf '%s is bigger than %s\n' "$file2" "$file1"
    fi
done

これはzsh、組み込みコマンドを使用してzstatファイルサイズを移植可能にインポートするシェルスクリプトです。

このスクリプトは、ディレクトリに隠された名前ではなく、すべての一般的なファイルを繰り返しますdir2。これらのファイルごとに、dir2そのファイルのパス名がdir1。ファイルがdir1存在し、一般ファイル(または一般ファイルへのシンボリックリンク)の場合は、2つのファイルのサイズを比較します。入力ファイルがdir2かなり大きい場合は、短いメッセージが出力されます。

このパターンは、dir2/*(.)ディレクトリ内の一般ファイルの隠し名前でない場合にのみ一致しますdir2。これは通常のファイルにのみ一致させる特定の修飾子(.)です。zsh*

式は、"dir1/${file2##*/}"最後に削除された項目を含む、それ以前のすべてのdir1/値で始まり、含めるパス名に展開されます。これはに変更されることがあります。$file2/"dir1/$( basename "$file2" )"

おすすめ記事