我在尝试创建脚本以将目录中的所有文件重命名为.txt
Linux 上时遇到问题。
这是我到目前为止所拥有的。
#!/bin/bash
location_number=$(find /hw1/textarchive | wc -l)
org_path=/hw1/textarchive/!(*txt)
count=0
#for count in $location_number
#do
# rename $org_path .txt
#rename $org_path *.txt
# mv $org_path $org_path.txt
#done
for count in $location_path
do
rename $org_path .pro .txt *.pro <-----was trying to just rename .pro to .txt (no luck)
done
echo done
我尝试使用mv
andrename
但没有任何结果。当mv $org_path $org_path.txt
我运行时,我会收到类似于 的错误(this file) is not a directory
。有了rename
它,运行时不会出现任何错误,但它不会将任何文件重命名为.txt
.
答案1
for name in /hw1/textarchive/*.pro; do
newname=${name%.pro}.txt
echo mv "$name" "$newname"
done
或者更短,
for name in /hw1/textarchive/*.pro; do
echo mv "$name" "${name%.pro}.txt"
done
echo
(当您确定它正在做正确的事情时删除)
这会迭代下面.pro
的所有文件/hw1/textarchive
并将它们重命名为.txt
文件。替换将从 中的名称末尾${name%.pro}
删除扩展名。.pro
$name
如果你想重命名全部文件:
for name in /hw1/textarchive/*; do
echo mv "$name" "${name%.*}.txt"
done
将${name%.*}
删除任何名称末尾的扩展名。现有.txt
文件也将被处理,但不会更改其名称。没有扩展名的文件将获得新的.txt
扩展名。这还将获取非文件的名称(如目录),因此以下更改将跳过这些名称:
for name in /hw1/textarchive/*; do
test -f "$name" || continue
echo mv "$name" "${name%.*}.txt"
done
谨慎的做法可能是确保不存在具有新名称的目录条目:
for name in /hw1/textarchive/*; do
test -f "$name" || continue
test -e "${name%.*}.txt" && continue
echo mv "$name" "${name%.*}.txt"
done
在另一种等效形式上:
for name in /hw1/textarchive/*; do
if [ -f "$name" ] && [ ! -e "${name%.*}.txt" ]; then
echo mv "$name" "${name%.*}.txt"
fi
done
该-f
测试测试给定常规文件是否存在。该-e
测试测试给定名称是否存在(无论它是什么名称)。
该解决方案不需要bash
(仅需要sh
兼容的外壳)。