批量修改文件名中

option1= 头部添加。option=2 尾部添加。option=3 替换 

#!/bin/bash

option=$1
path=$2
modifyString=$3

#1.头部添加;2.修改 3. 删除
echo "addheadString=1; replaceString=2"
echo "Entry keyword you want to change"

if [ ${option} -eq 1 ];then
for i in `find /test/testshelli1 -name "*${path}*"`
do
 echo ${i##*/}
 for var in ${i##*/}
 do
  mv -f "$var" `echo "$var" |sed 's/^/'${modifyString}_'/'`
 done
done


elif [ ${option} -eq 2 ];then
for i in `find /test/testshell1 -name "*${path}*"`
do
 for var in ${i##*/}
 do
  mv "$var" `echo $var | tr ${path} ${modifyString}`
 done
done


elif [ ${option} -eq 3 ];then
for i in `find /test/testshell1 -name "*${path}*"`
do
 for var in ${i##*/}
 do
  mv $var `echo $var | sed 's/'${path}'//g'`
 done
done
fi


下面这些替换语句都不可以:
# ls | xargs -i echo mv {} {} | sed 's/app/add/g' | sh
# ls | xargs -i echo mv {} {} | sed 's/${path}/${modifyString}/2g' | sh
# ls | xargs -i echo mv {} {} | sed 's/app/sss/2g' | sh
# rename "s/${path}/${modifyString}/" ${path}
# rename "s/${path}/${modifyString}/"
#  mv "$var" s/${i%${path}}${modifyString}/g'`
#  mv -f "$var" `echo $"var" | sed 's/${path}/${modifyString}/g'`
#  mv -f {} {} | sed 's/${path}/${modifyString}/2g' | sh

在linux 下查找文件内容包含某个特定字符串的文件

当前目录是/test/tempshell3, 在当前目录下找到path关键字,然后把path关键字换成要替换的modifyString
if [ ${option} -eq 3 ];then
for i in `find /test/tempshell3 -name "*${path}*"`
do
 for var in ${i##*/}
 do
  mv "$var" `echo $var | tr ${path} ${modifyString}`
 done
done
fi

linux命令在终端执行命令并将结果赋值给变量 :data=`df` 用反引号就可以了

shell脚本定义参数并使用

定义:
path=$1
oldString=$2
newString=$3

使用:
${path}
${oldString}
${newString}

shell基本的操作

0、用类似 GPRename 这样的图形软件进行批量重命名

1、删除所有的 .bak 后缀:
rename 's/\.bak$//' *.bak

2、把 .jpe 文件后缀修改为 .jpg:
rename 's/\.jpe$/\.jpg/' *.jpe

3、把所有文件的文件名改为小写:
rename 'y/A-Z/a-z/' *

4、将 abcd.jpg 重命名为 abcd_efg.jpg:
for var in *.jpg; do mv "$var" "${var%.jpg}_efg.jpg"; done

5、将 abcd_efg.jpg 重命名为 abcd_lmn.jpg:
for var in *.jpg; do mv "$var" "${var%_efg.jpg}_lmn.jpg"; done

6、把文件名中所有小写字母改为大写字母:
for var in `ls`; do mv -f "$var" `echo "$var" |tr a-z A-Z`; done

7、把格式 *_?.jpg 的文件改为 *_0?.jpg:
for var in `ls *_?.jpg`; do mv "$var" `echo "$var" |awk -F '_' '{print $1 "_0" $2}'`; done

8、把文件名的前三个字母变为 vzomik:
for var in `ls`; do mv -f "$var" `echo "$var" |sed 's/^.../vzomik/'`; done

9、把文件名的后四个字母变为 vzomik:
for var in `ls`; do mv -f "$var" `echo "$var" |sed 's/....$/vzomik/'`; done

10. 把.txt变成.txt_bak 的后缀
ls *.txt|xargs -n1 -i{} mv {} {}_bak
xargs -n1 –i{} 类似for循环,-n1意思是一个一个对象的去处理,-i{} 把前面的对象使用{}取代,mv {} {}_bak 相当于 mv 1.txt 1.txt_bak

find ./*.txt -exec mv {} {}_bak \;  
这个命令中也是把{}作为前面find出来的文件的替代符,后面的”\”为”;”的脱意符,不然shell会把分号作为该行命令的结尾.

字符串的截取

shell中的 ${},## 和 %% 的使用

假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:

1. 截断功能

${file#*/}:删掉第一个/ 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个/  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个.  及其左边的字符串:file.txt
${file##*.}:删掉最后一个.  及其左边的字符串:txt
${file%/*}:删掉最后一个/  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个/  及其右边的字符串:(空值)
${file%.*}:删掉最后一个.  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个.   及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:
# 是去掉左边(键盘上 # 在 $ 的左边),## 最后一个;
% 是去掉右边(键盘上 % 在 $ 的右边),%% 第一个。

linux 一些命令

注意 : -exec后跟的命令行,必须用“ ;”结束
1. 找到文件所在位置

2. 找到欲修改名字的文件   find / -name "file-keywords" 2>&1 | grep -v "denied"

3. 查找文件中含有关键字的文件 grep -rn "content-keywords"  /home/

4. find /test -name '*.exe' -type f -print -exec rm -rf {} \;
(1) “.” 表示从当前目录开始递归查找
(2) “ -name ‘*.exe’ "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件
(3) " -type f "表示只找file,文件类型的,目录和其他字节不要
(4) “-print” 输出查找的文件目录名
(5) 最主要是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。
exec选项后面跟随着所要执行的命令或脚本,就是将参数传递给后面的命令行
(6){}表示查找到的文件
(7)-exec后跟的命令行,必须用“ ;”结束