我需要根据已知关键字更改脚本中的文件名。
例如,文件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”分配给变量?
谢谢!
答案 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! 我对他的帖子进行了一些修改以采用我的应用程序:
我将文件名搜索更改为“./sno*.root.T127C”
我添加了一行“newfilename”来删除文件名的“./”部分。
以下是整个代码适用于我。
希望它对其他潜在的人也有用。
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)