精华内容
下载资源
问答
  • Shell 命令行一个自动整理 ~/Downloads/ 文件夹文件脚本在 mac 或者 linux 系统中,我们浏览器或者其他下载软件下载文件全部都下载再 ~/Downloads/ 文件夹下面。日积月累,我们文件会越来越多。手工...

    Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本

    mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文件夹下面。日积月累,我们的文件会越来越多。手工整理这些文件是比较繁琐的工作,于是,我就思考,我能不能用 shell 来自动整理这些下载的文件。

    说干就干。

    为了避免破坏我本地的文件,我自己搞了一个虚拟机跑了一个 centos 然后写下了如下的脚本。

    第一版代码(处理文件名带空格的文件会出错)

    #!/bin/bash
    # Name cleardown
    # Description move you files in ~/Downloads to ~/Documents/OfficeFiles
    # Author FungLeo
    # WebSite http://blog.csdn.net/fungleo
    
    # find .  -maxdepth 1 -type f
    # Excel  Other  PDF  Photo  PPT  Word  Xmind  Zip
    
    # 设定要整理的文件夹为下载目录
    downFinder=~/Downloads/
    # 看看下载目录根目录下有哪些文件
    dfiles=$(ls -l $downFinder | grep ^- | sed 's/[ ][ ]*/,/g' | awk -F "," '{print $NF}')
    # 准备将这些文件处理到哪里去
    filesFinder=~/Documents/OfficeFiles/
    
    # 分辨文件类型,并给出放到哪里去的建议。这里大家可以根据自己的需求完善 case 语句
    function fileType() {
      case $1 in
        'jpg' | 'png' | 'gif' | 'jpeg' | 'bmp')
          echo 'Photo'
        ;;
        'doc' | 'docx')
          echo 'Word'
        ;;
        'xls' | 'xlsx')
          echo 'Excel'
        ;;
        'ppt' | 'pptx')
          echo 'PPT'
        ;;
        'zip' | '7z' | 'rar')
          echo 'Zip'
        ;;
        'xmind')
          echo 'Xmind'
        ;;
        'pdf')
          echo 'PDF'
        ;;
        *)
          echo 'Other'
        ;;
      esac
    }
    
    # 判断目标文件夹中是否包含这个文件
    function hasfile() {
      if [ -f $1 ]; then
        echo 'has'
      else
        echo 'nohas'
      fi
    }
    
    # 给文件重新命个名字,我这里是在后面加了一个 1
    function changeFileName() {
      local filename=$(basename $1)
      echo ${filename%.*}1.${filename##*.}
    }
    
    # 开始搬文件的函数
    function mvFile() {
      # 这个函数需要传两个参数,一个是原文件名,一个是新文件名。
      local name=$1
      local newname=$2
      # 获取文件的后缀名,并且转化为小写
      local type=$(echo $1 | awk -F "." '{print $NF}' | tr "[:upper:]" "[:lower:]" )
      local classify=$(fileType $type)
      local file=$filesFinder$classify'/'$newname
      # 判断新文件名在目标地址是否有同名文件
      local hasf=$(echo $(hasfile $file))
      if [ $hasf = 'has' ]; then
        mvFile $name $(changeFileName $newname)
      else
        mv $downFinder$name $file
      fi
    }
    
    # 循环这些文件,并且进行处理
    for i in $dfiles; do
      mvFile $i $i
    done

    小结

    其中还是使用到了很多的知识点的。

    1. case 语句。一开始用 if 判断,越写越丑。查了下 case 语句,果然清爽很多了。
    2. 获取文件后缀名。本例中用了两种方法。
      1. awk 方法。awk -F "." '{print $NF}'. 分割取最后一个。
      2. ${filename##*.} 取后缀名。${filename%.*} 取文件名
    3. 函数的写法。其实不写 function 也是可以的。
    4. 函数自己调自己,和 js 也没太大区别嘛。
    5. 字符串大小写转换 tr "[:upper:]" "[:lower:]"

    2017年08月08日补充,解决文件名中包含空格的问题

    #!/bin/bash
    # Name cleardown
    # Description move you files in ~/Downloads to ~/Documents/Office Files
    # Author FungLeo
    # WebSite http://blog.csdn.net/fungleo
    
    # find .  -maxdepth 1 -type f
    # Excel  Other  PDF  Photo  PPT  Word  Xmind  Zip
    
    # 设定要整理的文件夹为下载目录
    downFinder="${HOME}/Downloads/"
    # 准备将这些文件处理到哪里去
    filesFinder="${HOME}/Documents/Office Files/"
    
    # 分辨文件类型,并给出放到哪里去的建议。这里大家可以根据自己的需求完善 case 语句
    function fileType() {
      case $1 in
        'jpg' | 'png' | 'gif' | 'jpeg' | 'bmp')
          echo 'Photo'
        ;;
        'doc' | 'docx')
          echo 'Word'
        ;;
        'xls' | 'xlsx')
          echo 'Excel'
        ;;
        'ppt' | 'pptx')
          echo 'PPT'
        ;;
        'zip' | '7z' | 'rar')
          echo 'Zip'
        ;;
        'xmind')
          echo 'Xmind'
        ;;
        'pdf')
          echo 'PDF'
        ;;
        *)
          echo 'Other'
        ;;
      esac
    }
    
    # 判断目标文件夹中是否包含这个文件
    function hasfile() {
      if [ -f $1 ]; then
        echo 'has'
      else
        echo 'nohas'
      fi
    }
    
    # 给文件重新命个名字,我这里是在后面加了一个 1
    function changeFileName() {
      local filename=$(basename $1)
      echo ${filename%.*}1.${filename##*.}
    }
    
    # 开始搬文件的函数
    function mvFile() {
      # 这个函数需要传两个参数,一个是原文件名,一个是新文件名。
      local name=$1
      local newname=$2
      # 获取文件的后缀名,并且转化为小写
      local type=$(echo $1 | awk -F "." '{print $NF}' | tr "[:upper:]" "[:lower:]" )
      local classify=$(fileType $type)
      local file="$filesFinder$classify/$newname"
      # 判断新文件名在目标地址是否有同名文件
      local hasf=$(echo $(hasfile $file))
      if [ $hasf = 'has' ]; then
        mvFile $name $(changeFileName $newname)
      else
        mv "$downFinder$name" "$file"
      fi
    }
    
    # 设置分隔符为换行
    OLD_IFS=$IFS
    IFS=$'\n'
    # 循环这些文件,并且进行处理
    for i in $(find "$downFinder" -maxdepth 1 -type f -not -name ".*" | awk -F "/" '{print $NF}'); do
      mvFile $i $i
    done
    
    # 将分隔符设置为默认,以免影响后面的程序
    IFS=$OLD_IFS

    补充小结

    1. 我先前没有考虑文件夹或者文件包含空格的情况,导致很多问题。
      1. 当把路径用引号 " 引起来的时候,不会解析 ~ 所以要用 ${HOME} 代替
      2. 在引用变量的时候,变量也要用引号引起来。注意,不能是单引号。
    2. 默认分隔符为空白,包含:空格、制表符、回车符,用 IFS 表示。
    3. echo 最终命令,和实际执行的结果不一定是一致的。
    4. find . -not -name ".*" 表示不找隐藏文件

    以上脚本均在 centos 和 MAC 下测试通过,在其他 linux 下可能会有稍许不同。
    本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

    展开全文
  • Linux命令行与shell脚本编程大全(第2版)

    千次下载 热门讨论 2014-02-20 13:51:01
    14.4 创建自己的重定向 14.4.1 创建输出文件描述符 14.4.2 重定向文件描述符 14.4.3 创建输入文件描述符 14.4.4 创建读写文件描述符 14.4.5 关闭文件描述符 14.5 列出打开的文件描述符 14.6 阻止命令输出 ...
  • 实在是觉得Linux下的mail和mailx工具难用,太复杂,于是自己用Python了个简单,maily,练练手。maily分两个模式,inline和infile,即两个subcommand。inline,发送邮件所有参数都在命令行输入,不会去读取任何...

    实在是觉得Linux下的mail和mailx工具难用,太复杂,于是自己用Python写了个简单的,maily,练练手。

    maily分两个模式,inline和infile,即两个subcommand。

    inline,发送邮件的所有参数都在命令行输入,不会去读取任何配置文件,除了命令行指定的一个或多个附件。

    infile,发送邮件的所有参数都从一个JSON配置文件中读出来,可批量发送。JSON文件中可以设置多个邮件发送账号,每个发送账号可以带多个Email消息内容。(需求来自公司每个月要给员工发送工资条)

    inline子命令

    既然所有参数都在命令,命令就一定很长,没办法,不过有些参数有默认值,可以不输入。

    $ python3 maily.py inline --subject a_title --content test_content

    --to to@qq.com --fromaddr from@qq.com --passwd your_password

    --smtp smtp.qq.com

    还有更多的参数:

    -a,添加附件;

    --cc和--bcc,添加抄送和密送名单;

    还有 --port, --tlayer 等参数,具体请看:python3 maily.py inline -h

    python3 maily.py inline -h

    值得一说的是,maily可以接收通过管道过来的数据作为 --content 参数的内容,比如你可以在命令行这样:

    $ python3 maily.py inline ... < content.txt

    $ echo 'your content' | python3 maily.py inline ...

    --content 参数内容中的 \n,就是换行。而通过echo命令过来的内容,如果不使用-e参数,\n就是\n两个字符。

    --contype 可以是 html,此时 --content 的内容就是一串自己定义的html格式的字符串。

    infile子命令

    $ python3 maily.py infile msg.json

    infile模式的命令行就很简单了,只需要带上一个JSON格式的文件即可。repo中提供了一个简单的msg.json文件作为示例。

    msg.json的内容如下:

    $ cat msg.json

    [

    {

    "fromaddr": "account@qq.com",

    "passwd": "password",

    "server": "smtp.qq.com",

    "msg": [

    {

    "subject": "send to me",

    "to": [

    "to@qq.com"

    ]

    }

    ]

    },

    {

    "fromaddr": "account@163.com",

    "passwd": "password",

    "server": "smtp.163.com",

    "port": 587,

    "connect": "tls",

    "timeout": 3,

    "debuginfo": false,

    "interval": 3,

    "msg": [

    {

    "subject": "test json email 11",

    "to": [

    "to1@qq.com",

    "to2@qq.com"

    ],

    "cc": [],

    "contype": "plain",

    "content": [

    "\u4eba\u751fhahaha...lalala...\n",

    "This is second line,\n",

    "third line..."

    ]

    },

    {

    "subject": "test json file 12",

    "to": [

    "tototo@hotmail.com"

    ],

    "cc": [

    "cc@qq.com"

    ],

    "bcc": [],

    "contype": "html",

    "content": [

    "

    2222...hahaha...lalala..."

    ],

    "attachment": [

    "/home/pi/test/hh1.c",

    "/home/pi/test/hh1"

    ]

    }

    ]

    }

    ]

    应该都能看懂哈。。。

    整体是一个list,每个smtp账号对应一个object,object内用msg这个list来包含一个或多个Email!其中有一些item是optional的,可以不出现,maily会直接使用默认值。

    interval这个参数表示,对于每一个账号,每发送一封Email后的间隔时间。(也许能够有一点点anti-spam的效果)

    我在公司制作的发工资条系统是这样的:用一个独立的工具,将财务那边的Excel文件转换成maily能够识别的JSON格式,--contype 用 html,--content 内有一个表格......最后用maily跑一遍即可。不管财务制作的工资Excel文件的格式是什么样的,只需要调整那个用于转换的工具,而maily保持不变。

    版本

    2020年10月28日:V0.21

    更多对于infile模式的输入检查,可以更容易发现格式方面的问题;

    infile模式下,tpye修改为contype,与inline模式对齐;

    2020年10月9日:V0.20

    对infile子命令输入的json文件最更多的检查;

    content修改为一个string list;

    2020年9月8日:V0.19

    bugfix版本

    2020年8月21日:V0.18

    增加infile子命令

    重构部分代码,bugfix

    2020年7月24日:V0.17

    在inline子命令中,增加--tlayer选项,支持自定义port

    bugfix

    2020年7月22日:V0.16

    第1个版本,提供inline子命令。

    -- EOF --

    展开全文
  • 今天弄了个docker的ubuntu官方镜像,想在镜像里做一点实验,免得把自己的环境得乱七八糟。把代码文件mount进去之后,开始编译,但是镜像太干净了,什么工具都没有,于是先装cmake apt-get install cmake3分钟后...

    518ad6c5c02602a4d022728fa026e012.png

    今天弄了个docker下的ubuntu官方镜像,想在镜像里做一点实验,免得把自己的环境写得乱七八糟。

    把代码文件mount进去之后,开始编译,但是镜像太干净了,什么工具都没有,于是先装cmake

        apt-get install cmake

    3分钟后切回来一看....

    还是10%???

    突然想起来,软件源忘记换了。所以更新起来异常困难。

    那就换软件源吧,找了一下阿里的

        deb Index of /ubuntu/ bionic main restricted universe multiverse
        deb Index of /ubuntu/ bionic-security main restricted universe multiverse
        deb Index of /ubuntu/ bionic-updates main restricted universe multiverse
        deb Index of /ubuntu/ bionic-proposed main restricted universe multiverse
        deb Index of /ubuntu/ bionic-backports main restricted universe multiverse
        deb-src Index of /ubuntu/ bionic main restricted universe multiverse
        deb-src Index of /ubuntu/ bionic-security main restricted universe multiverse
        deb-src Index of /ubuntu/ bionic-updates main restricted universe multiverse
        deb-src Index of /ubuntu/ bionic-proposed main restricted universe multiverse
        deb-src Index of /ubuntu/ bionic-backports main restricted universe multiverse

    只要把这个写到

        /etc/apt/sources.list

    里面就可以用阿里维护的软件源了,然后

        /etc/apt# vi sources.list
        bash: vi: command not found

    ??vi都没有??这也太干净了吧!!

        vim sources.list
        bash: vim: command not found

    果然,vim也没有....

    这就糟糕了,以前用的ubuntu至少vi是有的啊,这下子我连编辑文本的东西都没了,一下子慌了...

    不管了,先把vim下起来

        apt-get install vim 

    然后上网找找有没有什么内置的编辑器,果然找了一圈,都是说什么vi,vim,emacs,nano,gedit(一个GUI的文本编辑器,Ubuntu默认安装,但我是命令行啊...)。

    好吧,失败了,这下难道只能等了??

    回来看了眼vim下载进度,还有20min...


    喝口肥宅欢乐水,冷静一下

    我靠,零度可口可乐真TM难喝!!!就像是甜的陈年酱油,昨晚超市那胖子还推荐我买:喝这个不会长胖的~~

    我又不怕胖,为什么要买这个???


    不过这么一刺激,还真想起来,好像用echo可以写文件的?

    试一下

        # echo "11111" > 123.txt
        # cat 123.txt
        11111

    诶嘿,这不就可以了嘛。

    赶紧把sources.list备份一下

        cp sources.list sources.list_bak

    然后重写sources.list

        rm sources.list
        echo "deb Index of /ubuntu/ bionic main restricted universe multiverse" > sources.list

    冒号别忘记了。

    更新信息

        sudo apt-get update
        sudo apt-get upgrade

    果然成功了,下个vim一下了就好了~~

    PS:

    经过一晚上,脑子清醒了,发现大家也被我带坑里了...

    其实最简单的方法,在docker外建好sources.list这个文件,放到mount的文件夹里,然后进docker,拷贝一下就好了。

    展开全文
  • 在日常学习和开发过程中,不管是自己练习时候个小demo,还是到了公司后台服务代码,绝大部分还是在windows环境开发,无论是看文档还是代码都非常方便,鼠标点一点就能自动部署,一键启动服务。...

    在日常学习和开发过程中,不管是自己练习的时候写个小demo,还是到了公司写后台服务代码,绝大部分还是在windows环境下开发,无论是看文档还是写代码都非常的方便,鼠标点一点就能自动部署,一键启动服务。感觉好像自己在windows电脑上启动的服务也没啥问题啊,用起来也很好,有可视化界面,简单易操作,可为什么大家都说部署要部署到linux上面?要让我们去敲命令行,要让我们去写兼容linux 的代码
    这里就不得不说到一个问题,大部分软件行业的公司,都会把服务器部署在linux上面。那么为什么公司普遍要把服务器部署在linux上面而不直接用windwos呢?综合了各处资料总结出以下几点。

    1. 自由开源

      开源对于公司来说,意味着不用为操作系统支付任何费用,如果公司要为windows的商用购买正版,那么一套也不便宜。
      如果公司内部有大牛,那么完全可以手动修改linux源码,让其成为为自己公司“定制”的操作系统。

    2. 稳定性

      Linux系统以其最终的稳定性而闻名。在windows上,我们进程看到系统崩溃或者卡死,但是在linux上,这种情况发生的几率极小,并且linux系统还可以同时处理多个任务,在Windows配置中,更改配置通常需要重新启动。但是在linux中则不需要重启,配置的更改都可在系统运行时完成,且不会影响到不相关的服务,同样,windows服务器经常进行碎片整理,但是在linux上完全不需要这样做。

    3. 安全

      在安全方面,Linux显然比Windows更安全,因为Linux主要基于最初从多用户操作系统开发的UNIX操作系统。只有管理员或root用户具有管理权限,其次Linux也会病毒和恶意软件的攻击频率很低,很多病毒都是针对于windows,而针对linux的病毒比起windows少太多太多。其次,玩linux的用户群基本上都是计算机方面的人员,加上linux社区庞大,一般发现漏洞,很快会被并提交到linux开源社区。

    4. 成本低

      上面对于成本已经说到了一点,因为linux开源,企业不用为操作系统支付更多的费用。
      linux系统比起windows来说占用的系统资源更小。windows的图形化界面非常占用系统资源,很多小伙伴的windows系统一启动,什么软件都没打开,内存就被吃掉好几个G。由于linux系统上没有图形化界面,那么可以省去系统开销,对于企业来说,如果说同样的硬件设备,在windows上只能部署5个应用服务,那么在linux上可以部署8个或者更多。这意味着企业可以直接降低硬件成本。

    虽然linux很好,但是也并非适合所有的公司,如果公司使用了ASP,ASP.NET,MSSQL,MS ACCESS或Visual Basic开发工具等软件,则需要使用Windows Server。

    展开全文
  • 别人博客里,觉得对我这样新手很有用,转载过来记录一下,方便自己翻看。 ...本文给主要工作在Windows操作系统而又需要开发一些跨...GDB是一个由GNU开源组织发布、UNIX/LINUX操作系统下的、基于命令行的
  • 对于发布程序,我们最常用就是获取release版本exe后,拷贝对应动态库然后发布,但是QT我们可以使用相关软件代替,它能帮我们找到该exe所需动态库文件。下面我们直接参考以下文章即可,非常详细,很不错,...
  • [ZT]ubuntu比较好一些软件

    千次阅读 2009-05-03 09:48:00
    很多人都不喜欢命令行,这成为linux入门一个困难。但是ubuntu易用性还是有目共睹,下面列出的软件我都用过,功能不错,可以帮助你完成常见任务,而不必使用命令行。0、Ubuntu默认安装的软件(功能已经很强大,...
  • 12本精彩的Linux书籍

    2012-06-10 09:18:54
    回首数年之前,当我需要在Linux下写大量C程序代码时,我总会参考Vi文本编辑器快速参考手册。即使你已经用了很长时间Vi和vim编辑器,如果你没有读过这本书话,那么请你读一下这本书。你会惊讶于Vim编辑器...
  • libvpx在Windows下的编译

    千次阅读 2018-12-10 09:30:31
    因为要实现一个基于libvpx的视频编解码库,而... 首先安装Windows下的类linux环境mingw,也可以直接安装msys2,msys2提供了Linux下的命令行工具和git等其他常用工具,同时提供了mingw环境,该环境可以提供gcc编译器...
  • 糖果的软件

    2014-08-03 20:08:35
    份登录,或者是赋予自己删除文件权限,然后才能删除文件。要注意是, 操作者必须拥有这些文件所有权才能更改权限。 如果是因为文件使用了不规 范 ACL 而不能使用某些安全工具显示或修改其权限时, 可以尝试...
  • 网上和很多书上都有不少hadoop在linux系统下的安装教程,但是尝试过读者会发现,就算是按照这些教程一步步操作,还是会在某个地方出错,主要原因是版本问题。尤其是书上版本一般都较老,所以并不建议对着书...
  • 买板子可以把注意力集中在软件开发上,软件开发(尤其是驱动)可以不必担心自己硬件上问题,我就是以便调试一边驱动和程序,每次驱动前就要先确认硬件没问题。 另外,买板子更省钱和时间,我自己板子,...
  • Linux系统总复习.txt

    2015-06-04 19:39:59
    UNIX/Linux主要版本、开源/自由软件、X Window、Linux应用领域 2、Linux系统安装 掌握 1)VMware简单使用 2)Linux系统安装 图形安装和字符安装,图形安装-语言中文,字符安装-语言英文,硬盘分区(重要:分区...
  • 第一次遇到这个问题是在安装oracle时候,提示我根目录所在逻辑卷内存不够,必须要扩展空间才能继续安装下去,^^下面我们来详细怎么操作吧,因为自己走了很多弯路,所以会尽可能写的详细一些,以便初入门...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    普通用户只能修改自己的Shell,超级用户可以修改全体用户的Shell。要想查询系统提供哪些Shell,可以使用chsh -l 命令,见图1所示。 图1 系统可以使用的Shell类型 从图1中可以看到,笔者系统中可以使用的Shell有...
  • 本书介绍Linux环境下的编程方法,内容包括Linux系统命令、Shell脚本、编程语言、系统内核、安全体系、X Windows 等,内容丰富、论述全面,涵盖了Linux 系统方方面面。本书附带光盘包括了Redhat Linux系统最新...
  • Linux系统分析part2

    2008-10-29 14:56:33
    3.2 Linux系统下的文件共享和打印共享 22 3.2.1 Machintosh 环境 22 3.2.2 Windows 环境 22 3.2.3 Novell 环境 23 3.2.4 UNIX 环境 23 3.3 Linux系统中Internet/Intranet功能 23 3.3.1 邮件 23 3.3.2 Web 服务器 ...
  • Linux系统分析part1

    2008-10-29 14:20:24
    3.2 Linux系统下的文件共享和打印共享 22 3.2.1 Machintosh 环境 22 3.2.2 Windows 环境 22 3.2.3 Novell 环境 23 3.2.4 UNIX 环境 23 3.3 Linux系统中Internet/Intranet功能 23 3.3.1 邮件 23 3.3.2 Web 服务器 ...
  • Linux高级bash编程

    2009-07-28 10:26:07
    删除当前目录文件名中包含一些特殊字符(包括空白)文件.. 12-4. 通过文件 inode 号来删除文件 12-5. Logfile: 使用 xargs 来监控系统 log 12-6. 把当前目录下的文件拷贝到另一个文件中 12-7. 通过名字Kill进程...
  • 3.2 Linux系统下的文件共享和打印共享 22 3.2.1 Machintosh 环境 22 3.2.2 Windows 环境 22 3.2.3 Novell 环境 23 3.2.4 UNIX 环境 23 3.3 Linux系统中Internet/Intranet功能 23 3.3.1 邮件 23 3.3.2 Web 服务器 ...
  • 3.2 Linux系统下的文件共享和打印共享 22 3.2.1 Machintosh 环境 22 3.2.2 Windows 环境 22 3.2.3 Novell 环境 23 3.2.4 UNIX 环境 23 3.3 Linux系统中Internet/Intranet功能 23 3.3.1 邮件 23 3.3.2 Web 服务器 ...
  • 本书介绍Linux环境下的编程方法,内容包括Linux系统命令、 Shell脚本、编程语言(gawk、Perl)、系统内核、安全体系、X Window等,内容丰富、论述全面,涵盖了Linux系统方方面面。 目 录 前言 第一篇 Linux系统介绍 ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

linux下写自己的命令行软件

linux 订阅