gpt4 book ai didi

regex - Linux Shell 脚本 - 正则表达式过滤带有日期的文件名

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:05 25 4
gpt4 key购买 nike

我有数千个这种命名格式的文件:

cdr_ABSHCECLUSTER_02_201709072214_987392

我正在使用下面的批处理脚本,但我发现它会根据修改日期而不是实际创建时间来重新定位文件。我如何修改它以从文件名中提取年、月?

由于文件可以四处移动,我发现文件可以根据“修改日期”而不是创建日期放在错误的目录中。

统计显示选项:使用权修改的变了

 for dir in /sftphome/*;
do
echo "Entering parent directory: " $dir
cd $dir;
if [ -d "CDR" ]; then
dirpath="$(pwd)/CDR"
cd $dirpath

echo "Searching CDR directory for files " $dirpath
find . -maxdepth 2 -type f |
while read file ; do
#Check to see if object is a file or directory. Only copy files.
if [[ ! -d $file ]]; then
year="$(date -d "$(stat -c %y "$file")" +%Y)"
month="$(date -d "$(stat -c %y "$file")" +%b)"

#Create the directories if they don't exist. The -p flag makes 'mkdir' create the parent directories as needed
if [ ! -d "$dirpath/$year/$month" ]; then
echo "Creating directory structure $dirpath/$year/$month..."
mkdir -p "$dirpath/$year/$month";
echo "Directory $dirpath/$year/$month created."
fi

echo "Relocating $dirpath/$file to $dirpath/$year/$month"
cp -p $file "$dirpath/$year/$month"
rm -f $file
fi
done
echo "Relocation of all files in $dirpath is complete."
el

如有任何见解,我将不胜感激。谢谢!

最佳答案

这是根据文件名中的日期戳填充 yearmonth 变量的一种方法...

从变量 file 中的文件名开始 ...

file=cdr_ABSHCECLUSTER_02_201709072214_987392

使用下划线(_)作为分隔符,将file拆分成单独的字符串,放入名为ar的数组中;我们将遍历数组以显示组件 ...

IFS='_' read -ra ar <<< "${file}"
for i in "${!ar[@]}"
do
echo "ar[${i}] = ${ar[${i}]}"
done

# output from for loop:

ar[0] = cdr
ar[1] = ABSHCECLUSTER
ar[2] = 02
ar[3] = 201709072214
ar[4] = 987392

我们将解析 ar[3] 以获得我们的 yearmonth 值......

year=${ar[3]:0:4}     # 4-digit year  = substring from position 0 for 4 characters
mo=${ar[3]:4:2} # 2-digit month = substring from position 4 for 2 characters
echo "year=${year} , mo=${mo}"

# output from echo command:

year=2017, mo=09

但是您的脚本需要 Mmm 格式的 month (date +%b),所以稍微调整一下 ...

# convert our 2-character month to a 3-character 'Mon'th

month=$(date -d "${mo}" +%b)

# confirm our variables:

echo "year=${year} ; month=${month}"

# output from echo command:

year=2017 ; month=Sep

此时,我们已经根据文件名中的日期戳填充了 yearmonth 变量,现在您可以继续脚本的其余部分了。

综合起来:

# once the 'file' variable is populated:

IFS='_' read -ra ar <<< "${file}"
year=${ar[3]:0:4}
mo=${ar[3]:4:2}
month=$(date -d "${mo}" +%b)

关于regex - Linux Shell 脚本 - 正则表达式过滤带有日期的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46106406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com