linux - Shell 脚本 mkdir(如果没有)和 mv 文件到每一天

标签 linux bash shell

我需要 checkin 一个包含 150.000 个这种格式的 zip 文件的目录:

log_from_2012_08_14-11:57:12_To_2012_08_14-13:57:12.zip
log_from_2012_08_14-13:57:12_To_2012_08_14-15:57:12.zip
log_from_2012_08_14-15:57:12_To_2012_08_14-17:57:12.zip

如果有一个名称等于文件日期的目录:

2012_08_14 

然后将 From_2012_08_14 中存在的所有文件移动到该目录,如果不创建它

( mkdir date +%Y_%M_%D )

然后检查从 8 月到今天 11 月的每一天,每天的每个文件都在自己的目录中创建并移动到那里。

最佳答案

cd /relevant/log/directory

# Create the necessary sub-directories
ls *from_????_??_??-??:??:??_To_????_??_??-??:??:??.zip |
sed 's/.*from_\([0-9]\{4\}_[0-9][0-9]_[0-9][0-9]\).*/\1/' |
sort -u |
xargs mkdir -p

# Move the files into the sub-directories
ls *from_????_??_??-??:??:??_To_????_??_??-??:??:??.zip |
sed 's/.*from_\([0-9]\{4\}_[0-9][0-9]_[0-9][0-9]\).*/mv & \1;/' |
sh -x

-x 是可选的,但它会向您展示正在发生的事情。我假设您的文件名都不包含空格或换行符。我还假设没有包含字母数字的文件,其中 shell 模式中的 ? 应该与数字匹配。您可以将每个 ? 扩展为 [0-9] 如果您必须完全偏执,或者修改 sed 脚本以丢弃不存在的名称'匹配等

关于linux - Shell 脚本 mkdir(如果没有)和 mv 文件到每一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13225053/

相关文章:

javascript - WebUSB 无法连接,因为另一台设备正在使用相同的接口(interface)

linux - 使用双 SSH 的 Git

linux - 如何正确使用libevent的信号事件

bash - 在 bash 中索引当前行

仅颜色着色不同于文本+颜色着色

linux - Bash 提示脚本

c++ - 不确定如何创建 MakeFIle

c - 重定向已杀死的可执行文件的标准输出

c - Bash for Windows 10 gcc 不会编译粘贴到根目录中的 c 文件

linux - 从键盘 bash 脚本控制变量