多くのファイルを含む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" )"
答え2
#!/bin/bash
get_attr() {
# pass '%f' to $2 to get file name(s) or '%s' to get file size(s)
find "$1" -maxdepth 1 -type f -printf "$2\n"
}
while read -r file
do
(( $(get_attr "dir2/$file" '%s') > $(get_attr "dir1/$file" '%s') )) \
&& realpath -e "dir2/$file"
done < <(get_attr dir2 '%f')
これは、上記のように、すべてのファイルがのファイルとdir2
同じ名前であると仮定します。dir1
realpath
印刷ファイルの絶対パスです。
スクリプトは隠しファイル(で始まるファイル.
)も比較します。