通过删除文件名称末尾的“\n”来重命名文件

通过删除文件名称末尾的“\n”来重命名文件

我编写了一个 Python 脚本来解析大量数据并保存结果,最终生成了约 162 个文件。脚本将这些文件命名为Parsed_NameOfOriginal\n。请注意\n末尾的 ,这不是我的本意,但不知何故被我的脚本添加的。由于生成这些结果花费了很多时间,我不想再次运行修复后的脚本。

有没有办法使用 Linux 终端或 shell 脚本来重命名目录中具有相同名称的每个文件,但\n在最后进行修剪?

Parsed_ResultA\n变成Parsed_ResultA

注意:这是换行符这是添加的,而不是文本\n

答案1

这应该有效:

for f in *$'\n'; do mv -i "$f" "${f%$'\n'}"; done
  • *$'\n'扩展到所有以换行符结尾的文件名。

  • 循环for遍历所有匹配的文件,并将文件的名称保存在变量中F

  • ${f%$'\n'}从存储在的文件名中删除尾随的换行符F

  • mv -i重命名文件,提示是否会覆盖任何内容。

答案2

您可以使用 debian 包中的 perl 重命名器libfile-rename-perl

rename 's/\n//' Parsed_Result*

由于存在多种版本rename,请事先备份您的文件。

答案3

好的,好的,我的新变体:

$ touch boo$'\n'
$ touch foo$'\n'
$ ls -l
total 4
-rw-r--r-- 1 user user 54 Feb  9 12:16 111.sh
-rw-r--r-- 1 user user  0 Feb  9 12:17 boo?
-rw-r--r-- 1 user user  0 Feb  9 12:17 foo?
$ sh 111.sh 
$ ls -l
total 4
-rw-r--r-- 1 user user 54 Feb  9 12:16 111.sh
-rw-r--r-- 1 user user  0 Feb  9 12:17 boo
-rw-r--r-- 1 user user  0 Feb  9 12:17 foo
$ cat 111.sh 
for i in `find ./ -name '*
'`
do
  mv $i$'\n' $i
done
$

旧版本(错误):

使用 :

find ./ -name "*\n" | sed 's/\(.*\)\\n/mv \1\\\\n\ \1/'

创建重命名命令列表。然后只需将所有这些命令复制/粘贴到终端即可。示例:

$ touch 111\\n
$ touch 222\\n
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Feb  9 11:15 111\n
-rw-r--r-- 1 user user 0 Feb  9 11:15 222\n
$ find ./ -name "*\n" | sed 's/\(.*\)\\n/mv \1\\\\n\ \1/'
mv ./111\\n ./111
mv ./222\\n ./222
$ mv ./111\\n ./111
$ mv ./222\\n ./222
$ ls -l
total 0
-rw-r--r-- 1 user user 0 Feb  9 11:15 111 
-rw-r--r-- 1 user user 0 Feb  9 11:15 222 
$   

相关内容