フォルダに最新のファイルのみを保存し、古いファイルを保存場所に移動する方法

フォルダに最新のファイルのみを保存し、古いファイルを保存場所に移動する方法

私のフォルダには、次のファイルがいくつかあります。

ContractAdjustments.CHRS201804202144.txt
ContractAdjustments.CHRS201804212144.txt
ContractAdjustments.CHRS201804222144.txt
ContractAdjustments.CHRS201804232144.txt

最新のファイルだけをアーカイブし、残りはアーカイブの場所に移動したいと思います。次のスクリプトを使用していますが、エラーが発生します。

$ find -maxdepth 1 -type f -iname 'ContractAdjustments.*.TXT' -printf '%T@|%p\n' | sort -r -n | tail -n +2 | cut -d'|' -f2 | xargs -i mv {} ARCHV

ベストアンサー1

#!/bin/sh

mkdir -p ARCHIVE || exit 1

newest=
for file in ContractAdjustments.*.txt; do
    if [ -f "$file" ]; then
        if [ -z "$newest" ]; then
            # this is the first file, initialize "newest"
            newest=$file
        elif [ "$file" -nt "$newest" ]; then
            # file is newer than "newest",
            # archive "newest" and set new newest file
            mv -i "$newest" ARCHIVE
            newest="$file"
        else
            # file is older, archive it
            mv -i "$file" ARCHIVE
        fi
    fi
done

if [ -n "$newest" ]; then
    printf 'Done. Newest file = %s\n' "$newest"
else
    echo 'No files found'
fi

テストが組み込みコマンドで実装されると、/bin/shスクリプトは最新のファイルを変更せずにすべての古いファイルをフォルダに移動します。-nt[ARCHIVE

これは、指定されたパターンに一致するファイル名を繰り返し、各ファイルに対してこれまでに見つかった最新のファイルに対してタイムスタンプをテストし、最新のファイルか古いファイルであるかに応じてファイルを移動する方法で行われます。

スクリプトは、ファイル名にスペース文字などを保持する操作を正しく処理します。この特別なケースでは問題にならないかもしれませんが、通常、Unixファイル名にはファイル名のワイルドカードだけでなく、スペースや挿入された改行も含めることができます。


立ち寄りたいならファイル名ファイルのタイムスタンプに基づいて並べ替えるのではなく、次の手順を実行します。

#!/bin/sh

mkdir -p ARCHIVE || exit 1

set -- ContractAdjustments.*.txt

while [ "$#" -gt 1 ]; do
    mv -i "$1" ARCHIVE
    shift
done

printf 'Done. Newest file = %s\n' "$1"

これは、位置引数(など)を与えられたパターンに一致するファイルのリスト$1に設定します。$2次に、リストにまだ複数のファイルがある場合は、リストの最初のファイルをディレクトリに移動しARCHIVEてリストから削除します。リストの最後のファイルは、ファイル名に基づいて最後にランク付けされたファイルです(そのファイルは現在の場所に残ります)。

おすすめ記事