最新の5つのファイルのスクリプトを保持し、残りのファイルは別のターゲットに移動されます。

最新の5つのファイルのスクリプトを保持し、残りのファイルは別のターゲットに移動されます。

ソースコードパス:

/var/log/

これには4つのフォルダがあります。ad1nrld,ad2nrld,icp1rmnrl,icp2rmnrl

すべてのファイルを別のターゲットに移動できます/home/spsy/logs_bkp。ただし、このパスの各フォルダ(ad1nrld、ad2nrld、icp1rmnrl、icp2rmnrl)に最新の5つのファイルを保持し、/var/log残りのファイルは/home/spsy/logs_bkpそのパスに移動しようとします。

ソースパス /var/log/ad1nrld- 最近5つのファイルのみが表示され、残りはその/home/spsy/logs_bkp/ad1nrldパスに移動されます。

次のコードを使用してファイルを移動してみましたが、正常に移動されました。ただし、最新の5つのファイルをそのフォルダに保存することはできません。

for i in `ls -1rt | egrep 'nrld|mnrl'`
do
cd $i
mv *log /home/spsy/logs_bkp/$i
echo "files moved for &i"
cd ..
done

最新の5つのファイルを保持するコードを追加すると、次の部分は機能しません。

for i in `ls -1rt | egrep 'nrld|mnrl'`
do
cd $i
count_files=`ls -lrt | wc -l`
if [ $count_files -gt 5 ];
then
tomove=$(($count_files-5))
for part in `ls -1rt`
do
if [ $tomove -gt 0 ]
then
mv $part /home/spsy/logs_bkp/$i
tomove=$(($tomove-1))
echo "files moved for &i"
cd ..
fi
done
fi
done

ベストアンサー1

zsh通常、Solarisで利用可能な単純なバージョンをインストールしない限り、次のことができます。

#! /usr/bin/zsh -
src=/var/log dst=/home/spsy/logs_bkp
dirs=(ad1nrld ad2nrld icp1rmnrl icp2rmnrl)

ret=0
for dir ($dirs) () {
  if (( $# > 5 )) mv -- $@[6,-1] $dst/$dir/ || ret=$?
} $src/$dir/*(N.om)
exit $ret

omglob拡張にはglob修飾子を使用しますo(のみ定期的な修飾子.m修正時間別(最も若いものから最も古いものまでls -t)。D隠しファイルも考慮するには、修飾子を追加してください。

glob拡張子は、ディレクトリに5つ以上のファイルがある場合は、6番目のファイルを最後のファイルに移動してforそれを 。$dir$dirs

ksh や他のシェルでは、glob 修飾子がなければ、修正時間に基づいてファイルのリストをソートし、通常のファイルに制限するのは難しい部分です。

ls -t変更時間に基づいてソートしてもファイル名に改行文字が含まれていないことを保証できない場合、出力でファイルリストを簡単に再構成することはできません。そのような特別な状況が発生した場合は、次のようにすることができます。

#! /bin/sh -
src=/var/log dst=/home/spsy/logs_bkp
dirs='ad1nrld
ad2nrld
icp1rmnrl
icp2rmnrl'

IFS='
' # split on newline only
set -o noglob # disable globbing so we can use split+glob to split.

ret=0
for dir in $dirs; do # split+glob to split $dirs
  set --
  for file in $(ls -t -- "$src/$dir/"); do # split+glob to split ls output
    [ -f "$file" ] && [ ! -L "$file" ] && set -- "$@" "$src/$dir/$file"
  done
  if [ "$#" -gt 5 ]; then
    shift 5
    mv -- "$@" "$dst/$dir/" || ret="$?"
  fi
done
exit "$ret"

おすすめ記事