一个 bash 脚本请求(或 fish 脚本)。我有一堆文件,例如:
name - lastname.info
names - lastnames.info
name & name - lastname & lastname.info
但我想将它们全部更改为:
lastname - name.info
lastnames - names.info
lastname & lastname - name & name - lastname & lastname.info
一个 bash 脚本请求(或 fish 脚本)。我有一堆文件,例如:
name - lastname.info
names - lastnames.info
name & name - lastname & lastname.info
但我想将它们全部更改为:
lastname - name.info
lastnames - names.info
lastname & lastname - name & name - lastname & lastname.info
按照你的样本数据,你有" - "
作为分隔符,所以
for file in *; do
ext=${file##*.}
no_ext=${file%.*}
name=${no_ext% - *}
lastname=${no_ext##* - }
mv "$file" "$lastname - $name.$ext"
done
有关血腥细节,请参阅http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
您可以使用 for 循环遍历 cwd 中的所有文件,然后使用cut实用程序根据“-”分隔符解析文件名以获取名字和姓氏(然后我重新剪切以解析出文件扩展名),然后使用tr删除前导/尾随空格。最后连接,你就有了新的文件名:
for file in *
do
fname=`echo $file | cut -d '-' -f 1 | tr -d ' '`
lname=`echo $file | cut -d '-' -f 2 | cut -d '.' -f 1 | tr -d ' '`
newname=$lname' - '$fname.info
echo $newname
done
假设所有文件都在一个目录中:
for f in lastname*
do
mv $f `echo $f | sed 's/lastname/name/'`
done
如果您的文件位于层次结构中的任何位置,则必须使用该find
命令,但基本思想仍然存在。