假设我有多个文件名,例如R014-20171109-1159.log.20171109_1159。 我想创建一个shell脚本,它为每个给定日期创建一个文件夹,并将与日期匹配的文件移动到它。 这可能吗?
例如,应创建一个文件夹“20171109”并在其上放置文件“R014-20171109-1159.log.20171109_1159”。
由于
答案 0 :(得分:0)
下面的命令可以放在脚本中来实现这个目的,
使用下面的当前日期分配变量(如果需要更旧的日期,请使用 - date ='n day ago' 选项。)
如果需要从文件名本身获取它,在循环中获取文件然后使用 cut 命令获取日期字符串,
dirVar=$(date +%Y%m%d) --> for current day,
dirVar=$(date +%Y%m%d --date='1 day ago') --> for yesterday,
dirVar=$(echo $fileName | cut -c6-13) or
dirVar=$(echo $fileName | cut -d- -f2) --> to get from $fileName
使用如下变量值创建目录,( -p :如果不存在则创建目录。)
mkdir -p ${dirVar}
将文件移动到目录下面的行目录
mv *log.${dirVar}* ${dirVar}/
答案 1 :(得分:0)
由于您要编写shell脚本,请使用命令。要获取日期,请使用cut cmd,例如ex:
cat 1.txt
R014-20171109-1159.log.20171109_1159
cat 1.txt | cut -d "-" -f2
输出
20171109
是您的日期和创建文件夹。这样您就可以循环并创建任意数量的文件夹
答案 2 :(得分:0)
它实际上非常简单(我的Bash语法可能有点过时) -
for f in /path/to/your/files*; do
## Check if the glob gets expanded to existing files.
## If not, f here will be exactly the pattern above
## and the exists test will evaluate to false.
[ -e "$f" ] && echo $f > #grep the file name for "*.log."
#and extract 8 charecters after "*.log." .
#Next check if a folder exists already with the name of 8 charecters.
#If not { create}
#else just move the file to that folder path
break
done
主要观点来自这篇文章link。很抱歉没有提供实际代码,因为我最近在Bash上没有工作
答案 3 :(得分:0)
这是bash中for-loop
的典型应用程序,用于迭代文件。
同时,此解决方案使用GNU [ shell param substitution ]。
for file in /path/to/files/*\.log\.*
do
foldername=${file#*-}
foldername=${foldername%%-*}
mkdir -p "${foldername}" # -p suppress errors if folder already exists
[ $? -eq 0 ] && mv "${file}" "${foldername}" # check last cmd status and move
done