我的操作系统是 Solaris 10(64 位),日志目录中有很多文件,每天我们都会收到 40-50 个日志。我在此目录中存在最近 20 天的文件,并且我想将每天的文件移动到特定目录,该目录的名称附加有文件日期。
例如
File_name date
1.txt 31-jul-20122
2.txt 01-Aug-2012
然后为 2012 年 7 月 31 日的旧文件创建一个目录,并移动到新目录 31-jul RIO_31-Jul-2012 并移动它们,对于 8 月 1 日的文件也是如此。
我编写了一个脚本,该脚本在当前日期运行良好,但我不知道如何修改它以适应旧日期。
我的脚本如下
NEWDIR=RIO_31-Jul-2012
mkdir /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
cd /var/opt/ers/logs/rio
touch -t `date +%Y%m%d0000` dummy
find . -newer dummy -type f |
while read fname
do
mv $fname /ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/$NEWDIR
done
答案1
在 Solaris 下,您可以使用ls -E
.
迭代日志目录中的所有文件。对于每个文件,获取日期,根据需要创建目标目录,然后移动文件。
for f in /var/opt/ers/logs/rio/*; do
ymd=$(ls -Eog "$f" | awk '{print $4}')
target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
mkdir -p "$target"
mv "$f" "$target"
done
请注意,存档目录的名称将类似于RIO_2012-07-31
而不是RIO_31-Jul-2012
.我推荐 YMD 格式,因为它按时间顺序排序。如果您确实需要缩写的月份名称和 DMY 顺序,请使用ls -e
而不是ls -E
并相应地更改 awk 调用:
mdy=$(ls -eog "$f" | awk '{print $5 "-" $4 "-" $7}')
如果您需要递归地查找子目录中的文件,请find
调用迭代所有文件,然后再次执行每个文件的 shell 代码片段。
find /var/opt/ers/logs/rio -type f -exec sh -c '
ymd=$(ls -Eog "$0" | awk "{print \$4}")
target=/ersdg3/ERS/ERS_INPUT_LOGS/RIO/LOGS/RIO_$ymd
mkdir -p "$target"
mv "$0" "$target"
' {} \;
使用find
,您可以添加! -newer somefile
before-exec
以仅匹配早于somefile
.您只能添加-mtime 42
至少 42 天前修改过的匹配文件。
答案2
您可以通过 ctime o atime 查找文件,然后将列出的文件移动到正确的目录中:
find . -iname "*.txt" -ctime -<daysago> -type f
“天前”是一个整数。