ソースコードパス:
/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
om
glob拡張には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"
答え2
解析に依存せず、行終端としてls
使用するバージョン:find
\0
(あなたがSolarisを使用していてGNU
拡張機能を使用しているので、これはあなたには不可能かもしれませんが、他の人には役に立つかもしれません。)
dirs=(ad1nrld ad2nrld icp1rmnrl icp2rmnrl)
for dir in "${dirs[@]}"; do
find "$dir" -maxdepth 1 -type f -printf '%T@\t%p\0' \
| sort -rnz \
| tail -z -n+6 \
| cut -z -f2- \
| xargs -r0 mv --backup=numbered -t logs_bkp/
done
答え3
スクリプトが実行中です。ad1nrld,ad2nrld,icp1rmnrl,icp2rmnrl
/ var / logパスに4つのフォルダがあります。スクリプトはそのフォルダに最新の5つのファイルを保持し、残りのファイルはパス内の対応するフォルダに移動されます/home/spsy/logs_bkp
。
コードは次のとおりです。
cd /var/log
for i in `ls -1rt | egrep 'nrld|mnrl'`
do
cd $i
count_files=`ls -lrt | wc -l`
if [ $count_files -gt 6 ];
then
tomove=$(($count_files-6))
for part in `ls -1rt`
do
if [ $tomove -gt 0 ]
then
mv $part /home/spsy/logs_bkp/$i
tomove=$(($tomove-1))
fi
done
cd ..
fi
done