我发现如何在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
答案 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}"' '{}' \;
当您确定它符合您的要求时,请移除echo。请注意,假设您的路径中没有早期的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)