我的代码有效,但不是我想要的方式。基本上,我的代码所做的是查看当前目录、搜索文件夹,然后在这些文件夹中查看文件。如果其中一个文件扩展名是 $Example 变量的值,那么它应该删除具有相同起始文件名的所有其他文件,无论扩展名如何,并将具有 $Example 扩展名的文件重命名为相同的名称,只是没有 $示例扩展。这是代码:
#!/bin/sh
set -o errexit
Example=dummy
for d in *; do
if test "$(ls -A "$d" 2>/dev/null)"; then
if [ $(ls -1 ${d}/*.$Example 2>/dev/null | wc -l) -ge 1 ]; then
cd $(pwd)/$d;
for f in *.$Example; do
fileName="${f%.$Example}";
mv "$f" "${f%.$Example}";
#tr "\r" "\n" < "${f%.$Example}" > "${f%.$Example}"
listToDelete=$(find -name "$fileName.*");
for g in $listToDelete; do
rm $g;
done;
done;
cd ..;
fi;
fi;
done
正在使用的文件是在 VIM 中创建的,因此应该具有 Linux 格式,而不是 Windows 格式。出于某种原因,一旦扩展名被剥离,使用此代码,它会被格式化为 \r
,并且文件无法运行。我在我的临时解决方案所在的位置添加了评论,但我想知道是否有某种方法可以改变 mv
函数以保持 Linux 格式,或者是否有另一种方法可以实现我想要的.谢谢
最佳答案
The files being used have been created in VIM, so are supposed to have Linux formatting, rather than Windows formatting.
这对正在使用的行分隔符没有影响。
但我可以想到 3 种不同的可能原因。
ViM 替代
\r
和 \n
可能混淆了,或者 Windows 行分隔符 ( \r\n
) 可能被错误地删除了。如果您只是想在某个时候转换 Windows 行分隔符,请使用 dos2unix
将它们转换为 Unix 行分隔文件。而不是 sed
或 vim
如果可能的话,魔法然后编辑它们。如果文件使用 ViM 添加或替换行分隔符,请记住在 ViM 中使用 \n
搜索行分隔符并替换为 \r
因为 ViM 只是将文件数据加载到缓冲区中。例如%s/\n/somestring/
和 %s/somestring/\r/g
.
Cygwin
如果您使用的是 Cygwin,我很确定它默认为使用 Windows 行分隔符的 ViM,但您可以将其更改为 Unix 行分隔符。不过,我不记得如何摆脱困境了。
ViM 默认行分隔符
不确定如果您在 GNU/Linux 系统上会发生这种情况,但是可以使用 :e ++ff=unix
将 ViM 中使用的默认行分隔符指定给 Unix。
关于linux - 保持 *nix 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45042822/