如何恢复被脚本重命名的文件名

如何恢复被脚本重命名的文件名

我刚刚开始全职使用 Ubuntu(以前使用 Windows 10),我读到在 Linux 上文件名中带空格不是个好主意。所以我在网上找到了一个脚本(见下文),用下划线替换文件名中的空格,我打算用它来更改我从 Windows 传输过来的一些文件的名称,其中许多文件目前都有空格。

我创建了一个包含一些文件的测试文件夹,只是为了确保脚本能够按照我的要求执行。但是,我并没有运行脚本来更改测试文件夹中的名称,而是意外地将其运行在我的整个主目录中,这也更改了我的 .config 文件夹和其他我不想重命名的目录中的一些名称。这是我使用的脚本:

!/bin/bash
find -name "* *" -print0 | sort -rz | \
  while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done

以下是一些示例输出:

renamed './.config/google-chrome/Default/Managed Extension Settings' -> './.config/google-chrome/Default/Managed_Extension_Settings'
renamed './.config/google-chrome/Default/Secure Preferences' -> './.config/google-chrome/Default/Secure_Preferences'
renamed './vmware/windows_10_x64/Windows 10.vmxf' -> './vmware/windows_10_x64/Windows_10.vmxf'

我对 Linux 还不太熟悉(我相信您能看出来),我想知道是否有更有经验的人可以帮助我将文件名恢复到运行脚本之前的状态 - 只需撤消脚本所做的所有更改即可。谢谢。

答案1

如果您仍有脚本的输出,则可以手动重命名无意中更改的文件。供将来参考,Linux 可以很好地处理文件名中的空格。

答案2

这没有任何保证...
这应该在命令行主目录中运行。
示例输出文件也应该在主目录中,以方便操作。
小心地剪切并粘贴整个内容并执行。

grep "renamed" sampleoutputfilename.txt | sed s/renamed// | awk '{FS="->";print "unrenamed" $2 " moving back to " $1;system("mv " $2 " " $1)}'

请记住,我是根据从未见过的示例输出文件执行此操作的。所以我制作了看起来像这样的文件。

 renamed './.config/google-chrome/Default/Managed Extension Settings'
-> './.config/google-chrome/Default/Managed_Extension_Settings'
 renamed './.config/google-chrome/Default/Secure Preferences' -> './.config/google-chrome/Default/Secure_Preferences'
 renamed './vmware/windows_10_x64/Windows 10.vmxf' -> './vmware/windows_10_x64/Windows_10.vmxf'
 renamed './this1.txt' -> './that1.txt'
 renamed './Videos/this 2.txt' -> './Videos/that2.txt'
 renamed './this 3.txt' -> './that3.txt'
 renamed './.config/geany/this 4.txt' -> './.config/geany/that4.txt'
 renamed './this5.txt' -> './that5.txt'
 renamed './this 6.txt' -> './that6.txt'

....所以我假设了这种格式。
您可能希望首先通过剪切并粘贴所有这个/那个示例行到 testsampleoutput.txt 文件中来测试它...然后创建所有“那个”文件进行测试。

`touch './that1.txt' './Videos/that2.txt' './that3.txt' './that5.txt' './that6.txt'

您可能没有安装 geany,因此您可以将其关闭。

相关内容