Bash,根据脚本中的已知关键字更改文件名

时间:2014-02-20 18:28:34

标签: bash rename

我需要根据已知关键字更改脚本中的文件名。

例如,文件keywords.root.T127C应重命名为keywords_environment.root.T127C

我尝试使用此命令:

find . -name $keywords* | sed -e "p"

输出:./current_directory/keywords.root.T127C但我不知道将其分配给变量$var。如果可以分配,我知道如何使用如下命令修剪它:

echo "${var##*.}".

我的问题:

(1)只有一个命令有效吗?说,直接将“keywords.root.T127C”转换为“keywords_environment.root.T127C”?

(2)如果不是(1),如何将“./current_directory/keywords.root.T127C”分配给变量?

谢谢!

3 个答案:

答案 0 :(得分:3)

这是一个最佳实践实现(用于递归使用;用例可以使用globs而不是find更简单) - 使用NUL分隔的文件名流,因此即使使用不寻常的名称也是安全的(例如那些包含文字换行符的那些:)

while IFS='' read -r -d '' filename; do
  [[ $filename = *.* ]] \
    && mv -- "$filename" "${filename%%.*}_environment.${filename#*.}"
done < <(find . -name "${keyword}*" -print0)

另见BashFAQ #30

答案 1 :(得分:0)

使用sed

for i in $(find . -name "$keyword*"); do
  nn="$(echo -n "$i" | sed 's/\(.*'$keyword'\)\(.*\)/\1_environment\2/g')"
  mv -- "$i" "$nn"
done

这会将./keywords.root.T127C更改为./keywords_environment.root.T127C

答案 2 :(得分:0)

特别感谢Charles! 我对他的帖子进行了一些修改以采用我的应用程序:

  1. 我将文件名搜索更改为“./sno*.root.T127C”

  2. 我添加了一行“newfilename”来删除文件名的“./”部分。

  3. 以下是整个代码适用于我。

    希望它对其他潜在的人也有用。

    env_str="_environment."
    while IFS='' read -r -d '' filename; do
      [[ $filename = ./sno*.root.T127C ]] \
        && newfilename="${filename#./}" \
        && mv -- "$newfilename" "${newfilename%%.*}${env_str}${newfilename#*.}"
    done < <(find . -name "${keyword}*" -print0)