批处理路径扩展

%~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径、目录

cd是转到这个目录,不过我觉得cd /d %~dp0还好些

选项语法:

~0 -删除任何引号("),扩充%0
%~f0 -将%0扩充到一个完全合格的路径名(“f”是file,即文件)
%~d0 -仅将%0扩充到一个驱动器号
%~p0 -仅将%0扩充到一个路径
%~n0 -仅将%0扩充到一个文件名(“n”是name文件名)
%~x0 -仅将%0扩充到一个文件扩展名
%~s0 -扩充的路径只含有短名(“s”为Short,短的)
%~a0 -将%0扩充到文件的文件属性(“a”为attribute,即属性)
%~t0 -将%0扩充到文件的日期/时间(“t”time)
%~z0 -将%0扩充到文件的大小(Size大小)
%~$PATH:0 -查找列在路径环境变量的目录,并将%0扩充

到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串

可以组合修饰符来得到多重结果:

%~dp0 -仅将%0扩充到一个驱动器号和路径
%~nx0 -仅将%0扩充到一个文件名和扩展名
%~fs0 -仅将%0扩充到一个带有短名的完整路径名
%~dp$PATH:0 -查找列在路径环境变量的目录,并将%I扩充

到找到的第一个驱动器号和路径。

%~ftza0 -将%0扩充到类似输出线路的DIR
%0为当前批处理文件

如果0换成1为第一个文件,2为第2个


%0代指批处理文件自身
%~d0是指批处理所在的盘符
%~dp0是盘符加路径
cd %~dp0就是进入批处理所在目录

内容来源:
http://tomhibolu.iteye.com/blog/1215863

批量对某个目录下的git版本库执行相同操作

使用脚本git-each-repo很容易做到,它是基于bash的脚本
例如,要pull目录下的所有repo的版本库,只需

cd /path/to/base/dir
git-each-repo pull
#或者
git-each-repo -d /path/to/base/dir pull

获取最新版本:

国外

https://github.com/mjpclab/Shell-Utility/blob/master/bin/git-each-repo

国内:

https://gitee.com/mjpclab/Shell-Utility/blob/master/bin/git-each-repo

bash中容易搞混的几种括号运算符

$()

取得括号内运行命令的标准输出,作为当前命令行的命令或参数,其效果和``相同。
举例:mkdir $(date +%F)

$[]

执行整数运算。作用和let相似
举例:var=$[10+20]

$(())

执行整数运算。作用和let相似
举例:var=$((10+20))

(())

可在其中使用直观的数学比较运算符,比test命令的选项 -lt -gt等要直观。
举例:

root@debian:~# (( 1 > 0 )) && echo yes
yes
root@debian:~# (( 1 > 10 )) && echo yes
root@debian:~#

[[]]

test命令或[的增强版,bash专有扩展,在sh中不支持。可以用扩展正则表达式或通配符来比较字符串。
举例:正则表达式:

root@debian:~# [[ "123456" =~ ^[0-9]+$ ]] && echo yes
yes
root@debian:~# [[ "123456X" =~ ^[0-9]+$ ]] && echo yes
root@debian:~#

举例:通配符:

root@debian:~# [[ 'abc.txt' == abc.* ]] && echo yes
yes
root@debian:~# [[ 'abc.txt' == *.txt ]] && echo yes
yes
root@debian:~# [[ 'abc.txt' == *.jpg ]] && echo yes
root@debian:~#

经测试等号右边的模式不能用引号括起来,否则会识别失败

Linux下bash脚本借用tr命令批量修改文件名 (Change file name by command ‘tr’ using bash script under Linux)

bash脚本调用tr命令修改文件名,tr命令参数由用户指定。The bash script will call command ‘tr’ to change file names. parameters transfered to ‘tr’ is specified by user.

# Usage: fn-tr -p <tr parameters> -r <file/directory> <file/directory> ...
# -p parameters will transfered to command 'tr'  指定将会传递给tr命令的参数
# -d change directory     对目录执行更改操作
# -f change normal file  对普通文件执行更改操作
# -r recursive  递归搜索子目录

举例Example:
将/docs下文件名中的多个连续空格压缩到一个 remove duplicated white spaces of the filenames under /docs

ftr -p '-s " "' -fr /docs/*

bash脚本下载:bash script download:
https://gitee.com/mjpclab/Shell-Utility/raw/master/bin/fn-tr
https://raw.githubusercontent.com/mjpclab/Shell-Utility/master/bin/fn-tr

Linux下bash脚本批量修改文件名大写/小写 (Change file name to uppercase/lowercase using bash script under Linux)

# Usage: chfcase [-lur] <file/directory> <file/directory> ...
# -l change file name to lower case (default)    更改文件名为小写(默认)
# -u change file name to upper case  更改文件名为大写
# -d change directory  对目录执行更改操作
# -f change normal file  对普通文件执行更改操作
# -r recursive  递归搜索子目录
#

举例Example:

更改当前目录及所有子目录普通文件名为小写 Change all normal file names to lowercase under current directory recursively:

chfcase -lfr *

将当/var/html下的子目录更改为大写 Change directory name which under /var/www to upper case

chfcase -ud /var/html/*

bash脚本下载:bash script download:
https://gitee.com/mjpclab/Shell-Utility/raw/master/bin/fn-case
https://raw.githubusercontent.com/mjpclab/Shell-Utility/master/bin/fn-case

[转]FORFILES的用法(常用于备份文件的处理)

今天负责删除操作系统为windows server 2003的服务器上的log文件,本来打算直接用* .log 作为search 条件然后手动删除,无意中发现原来windows server 2003中竟然有forfiles.exe这个非常好用的新工具,用起来是非常方便,有了它就可以让它自己执行删除,你可以继续作别的事了。现在对它的用法做个简单介绍。

Forfiles
从文件夹或树中选择要进行批处理的文件。

语法
forfiles [/p Path] [/m SearchMask] [/s] [/c Command] [/d[{+ | -}] [{MM/DD/YYYY | DD}]]

参数
/p Path

指定 Path,表明要从哪里开始搜索。默认的文件夹是当前工作目录,该目录通过键入句号 (.) 指定。

/m SearchMask

按照 SearchMask 搜索文件。默认的 SearchMask 是 .

/s

指示 forfiles 在子目录中搜索。

/c Command

在每个文件上运行指定的 Command。带有空格的命令字符串必须用引号括起来。默认的 Command 是 “cmd /c echo @file”。

/d[{+ | -}] [{MM/DD/YYYY | DD}]

选择日期大于或等于 (+)(或者小于或等于 (-))指定日期的文件,其中 MM/DD/YYYY 是指定的日期,DD 是当前日期减去 DD 天。如果未指定 + 或 -,则使用 +。DD 的有效范围是 0 – 32768。

/?

在命令提示符下显示帮助。

注释
?
Forfiles 最常用于批处理文件中。

?
Forfiles /s 与 dir /s 类似。

?
下表列出了可在 /cCommand 命令字符串中使用的变量。

变量 描述
@file

文件名

@fname

无扩展名的文件名

@ext

文件扩展名

@path

文件的绝对路径

@relpath

文件的相对路径

@isdir

如果文件类型是目录,则计算值为 TRUE,否则值为 FALSE

@fsize

用字节表示的文件大小

@fdate

文件中上次修改的日期戳

@ftime

文件中上次修改的时间戳

?
使用 forfiles,可以在多个文件上运行命令或将参数传递给多个文件。例如,可以在树中带有 .txt 扩展名的所有文件上运行 TYPE 命令。或者,可以用文件名“Myinput.txt”作为第一个参数,在 C:\ 驱动器上执行每个批处理文件 (.bat)。

?
通过使用 forfiles,可以执行下列任何操作:

?
使用 /d 按照绝对或相对日期选择文件。

?
使用诸如 @fsize(文件大小)和 @fdate(文件日期)这样的变量构建文件的存档树。

?
使用 @isdir 变量区分文件和目录。

?
通过在命令行中包含特殊字符和使用十六进制代码 0xHH 环绕字符来格式化输出内容。

?
Forfiles 通过在旨在仅处理单个文件的工具上执行“循环子目录”标记来发挥作用。

示例
要列出驱动器 C: 上的所有批处理文件,请键入:

forfiles /p c:\ /s /m*.bat /c”cmd /c echo @file is a batch file”

要列出驱动器 C: 上的所有目录,请键入:

forfiles /p c:\ /s /m. /c”cmd /c if @isdir==true echo @file is a directory”

要列出驱动器 C: 上存在时间多于 100 天的所有文件,请键入:

forfiles /p c:\ /s /m. /dt-100 /c”cmd /c echo @file :date >= 100 days”

要列出驱动器 C: 上 1993 年 1 月 1 日以前创建的所有文件,而且对于日期早于 1993 年 1 月 1 日的文件显示“file is quite old!”,请键入:

forfiles /p c:\ /s /m. /dt-01011993 /c”cmd /c echo @file is quite old!”

要按列格式列出驱动器 C: 上所有文件的扩展名,请键入:

forfiles /p c:\ /s /m. /c “cmd /c echo extension of @file is 0x09@ext0x09” With:

要列出驱动器 C: 上的所有批处理文件,请键入:

forfiles /p c:\ /s /m *.bat /c “cmd /c echo @file is a batch file”

要列出驱动器 C: 上的所有目录,请键入:

forfiles /p c:\ /s /m . /c “cmd /c if @isdir==true echo @file is a directory”

要列出驱动器 C: 上存在时间多于 100 天的所有文件,请键入:

forfiles /p c:\ /s /m . /d t-100 /c “cmd /c echo @file :date >= 100 days”

要列出驱动器 C: 上 1993 年 1 月 1 日以前创建的所有文件,而且对于日期早于 1993 年 1 月 1 日的文件显示“file is quite old!”,请键入:

forfiles /p c:\ /s /m . /d t-01011993 /c “cmd /c echo @file is quite old!”

要按列格式列出驱动器 C: 上所有文件的扩展名,请键入:

forfiles /p c:\ /s /m. /c “cmd /c echo extension of @file is 0x09@ext0x09”