【问题标题】:Rename file in bash script在 bash 脚本中重命名文件
【发布时间】:2014-07-17 08:52:20
【问题描述】:

我发现已经有人问过如何在 bash 脚本中重命名多个文件。我已经检查了所有答案。但是,我无法解决我的问题。 我想在给定目录中找到具有特定名称的所有文件。然后,我想相应地重命名所有文件。我需要所有以“lattice”开头的字典,还需要以“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

【问题讨论】:

  • 这有点明显,但我认为您不应该在值和声明符符号 (=) 之间留有空格。此外,将变量放在引号之间,以防止 IFS 进一步扩展。在成对的反引号上使用 $() 以及在 Bash/POSIX 中使用它是首选。
  • 你也没有在那里使用你的 fnew 变量。您刚刚为其分配了一个值。

标签: bash file rename


【解决方案1】:

您只需要正确的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)

【讨论】:

  • 我尝试了您的解决方案。 bash 给出错误'find: invalid expression;你使用了一个二元运算符'-and'之前什么都没有。'我们如何解决这个问题。谢谢
  • @user2100161 你在什么操作系统上?你有什么版本的bash?什么版本的查找?
  • 操作系统是 UBUNTU。 bash 版本是 4.1.5。谢谢。找到 4.4.2
【解决方案2】:

也许rename 工具可以帮到你。

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

【讨论】:

  • 认为您的 rename 链接有误。那应该是comes with the perl libraries 的那个。尽管没有人使用它,但由于某种原因,它不是随 util-linux 一起提供的。
【解决方案3】:

你可以试试这样的

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

当您确定 符合您的要求时,请删除它。请注意,这是假设您的路径中没有一些 POSCAR. 目录。

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

【讨论】:

  • 它确实是 ib bash :mv -iv --lattice_1.1/POSCAR.1.1 lattice_1.1/POSCAR1.1。它不会将文件名更改为 POSCAR
  • @user2100161 所以你想要POSCAR.1.1 -&gt; POSCARPOSCAR.1.1 -&gt; POSCAR1.1
猜你喜欢
  • 2014-10-08
  • 2016-05-12
  • 2015-08-02
  • 2013-06-10
  • 2016-04-30
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多