源码路径:
/var/log/
在这里,我有 4 个文件夹命名ad1nrld,ad2nrld,icp1rmnrl,icp2rmnrl
我可以将所有文件移动到另一个名为/home/spsy/logs_bkp
. 但我想在此/var/log
路径的每个文件夹(ad1nrld、ad2nrld、icp1rmnrl、icp2rmnrl)中保留最新的 5 个文件,其余文件将移至/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
zsh
通常在 Solaris 上可用,除非您安装了它的精简版本,因此您应该能够:这使用
om
glob 限定符通过odification 时间(从最年轻到最旧的一样)来o
对 glob 扩展(仅具有限定符的常规文件)进行排序。如果您还想考虑隐藏文件,请添加限定符。.
m
ls -t
D
该 glob 扩展被传递给一个匿名函数,只要目录中有超过 5 个文件,该函数就会将第 6 个文件移动到最后一个文件,
for
每个文件都$dir
在$dirs
.使用 ksh 或其他 shell,如果没有 glob 限定符,困难的部分是按修改时间对文件列表进行排序,并仅限于常规文件。
ls -t
将按修改时间排序,但您无法轻松地从其输出中重建文件列表,除非您可以保证文件名不包含换行符。如果您处于这种特殊情况,您可以这样做:版本,不依赖于 parsing
ls
,而是使用find
and\0
作为行终止符:(因为您使用的是 Solaris,并且这使用了
GNU
扩展,所以这对您来说可能是不可能的,但可能对其他人有用)。脚本正在运行。
ad1nrld,ad2nrld,icp1rmnrl,icp2rmnrl
我在 /var/log 路径中有 4 个文件夹。/home/spsy/logs_bkp
脚本将在各自的文件夹中保留最新的 5 个文件,其余的将被移动到路径的各自文件夹中。这是代码。