最後の修正を除いて、まったく同じPDFファイルdirAとdirBという2つのディレクトリがあるとします。
各ファイル名(常にdirA、dirBにあると仮定)を検索し、各ファイル名に対してどのファイル(dirA / fileまたはdirB / file)が最後の変更時間が大きいかを出力できるbashスクリプト(awkなし)ですか?例えば
if dirA/file.lastmodified > dirB/file.lastmodified
##take action
答え1
GNU統計の使用:
shopt -s dotglob
for file in dirA/*; do
[[ -f "dirB/${file##*/}" ]] || continue
if (( "$(stat -c %Y "$file")" > "$(stat -c %Y "dirB/${file##*/}")" )); then
# take action
fi
done
答え2
Bash、ksh、zsh、ashには、あるファイルが他のファイルよりも最新であることをテストするための組み込み-nt
演算子[
(およびbash / ksh / zsh構成)があります。[[ … ]]
for x in dirA/*; do
y=dirB/${x#*/}
if [ "$x" -nt "$y" ]; then
# The file in dirA is more recent
elif [ "$y" -nt "$x" ]
# The file in dirB is more recent
else
# The two files have the same modification time
# or the file doesn't exist in dirB
fi
done
答え3
GNUツールを使用して可能な解決策:
find dirA dirB -type f -printf '%T@/%p\0' |
tr '\n\0\t/' '\0\n/\t' |
sort -k3 -k1,1rg |
uniq -f2 |
cut -f2- |
tr '\0/\t' '\n\t/'
dirAとdirB(およびそのサブディレクトリ)のすべてのファイルが報告されますが、2つのファイルが共通の場合は最新のファイルのみが報告されます(または2つのファイルが同じ場合はランダムに報告されます)。
これは同じdirA
値にのみ適用されます。つまり、スペースやスラッシュ文字は含まれませんが、含めることができるファイルパスに制限はありません。dirB
"dirA"
を使用すると、-type f
通常のファイルのみが報告されます(symlink、fifo、デバイス...は報告されません)。
find
-printf
、g
ソートタイプ、uniq
オプション、およびNUL文字を-f
処理する機能はGNUにのみ適用されます。sort
uniq
cut