我正在尝试复制文件夹中的所有.txt文件,但重命名为.html文件。
for f in my-txt-folder/*.txt
do
a="$(echo $f | sed s/.txt/.html/)"
cp "$f" "$a"
done
这是我的代码到目前为止,但是当我运行它时我得到了错误
my.html-folder/file.txt: No such file or directory.
我知道我收到此错误,因为它重命名了封闭文件夹中的“-txt”,但是如何阻止它呢?我也尝试将它替换为“\ .txt”但它仍然认为封闭文件夹名称是匹配的。如何使其仅匹配“.txt”?在有人要求之前,我不能只是钻进文件夹,然后从那里运行一个脚本。
答案 0 :(得分:5)
您可以使用for
构造来迭代文件名和参数扩展cp
- ing:
for file in *.txt; do cp -i "$file" "${file%.*}".html; done
参数扩展模式${file%.*}
获取文件名从末尾剥离.txt
的文件部分。因此,对于文件名foobar.txt
,我们会foobar
,然后会.html
添加foobar.html
。
示例:强>
$ ls *.txt
bar.txt foo.txt
$ for file in *.txt; do cp -i "$file" "${file%.*}".html; done
$ ls *.{txt,html}
bar.html bar.txt foo.html foo.txt
答案 1 :(得分:2)
在行尾匹配,例如
for f in my-txt-folder/*.txt
do
a="$(echo $f | sed -e 's/\.txt$/.html/')"
cp "$f" "$a"
done
以前的"。"您与sed
匹配的是一个通配符,并且您没有将该模式锚定在行尾。
还有另一种来自heemayl的bash解决方案刚刚发布;全壳解决方案的优势在于您还不必学习sed
的优点。