在bash脚本中重命名文件

时间:2014-05-28 08:27:59

标签: bash file rename

我发现如何在bash脚本中重命名多个文件已经被问到了。我检查了所有答案。但是,我无法解决我的问题。 我想在给定目录中找到具有特定名称的所有文件。然后,我想相应地重命名所有文件。我需要所有以'lattice'开头的dietories,还需要以'POSCAR'开头的文件。在格子目录中。我有许多以'lattice'开头的目录

这是我尝试过的。 Bash给出的错误就像“它们是相同的文件”

match=POSCAR.
replace=POSCAR
for D in *lattice*
do echo "$D"
  for file in $(find $D -name "*POSCAR*")
  do
    echo "$file"
    src=$file
    tgt=$(echo $file | sed -e "s/*$match*/$replace/")
    fnew= `echo $file | sed 's/*POSCAR/POSCAR/'`  
    mv $src $tgt
  done
done

3 个答案:

答案 0 :(得分:1)

也许rename工具可能会对您有所帮助。

rename 's/POSCAR\./POSCAR/' *lattice*

答案 1 :(得分:1)

您可以尝试这样的事情

find lattice* -type f -name 'POSCAR.*' \
    -exec bash -c 'echo mv -iv "$0" "${0/POSCAR./POSCAR}"' '{}' \;

当您确定它符合您的要求时,请移除。请注意,假设您的路径中没有早期的POSCAR.目录。

也不是,*WORD*在任何地方都匹配WORD的文件。 WORD*匹配以WORD开头的文件。另外,我假设您的意思是POSCAR.*是常规文件(即不是目录或符号链接,因此我包含了-type f

答案 2 :(得分:0)

您需要的只是正确的find语法和正确的bash string manipulation

while read -d $'\0' -r file; do

  # // replaces all matches. If you want only the first one use /
  newname=${file//POSCAR./POSCAR} 
  mv "$file" "$newname"

done < <(find \( -ipath '*/lattice*' -and -iname 'POSCAR.*' \) -print0)