重命名名称中包含空格的最近目录

重命名名称中包含空格的最近目录

我正在尝试重命名名称中带有空格的最近目录。

$ mkdir "foo bar"
foo bar
$ ls -c | head -1
$ mv $(ls -c | head -1) foobar

收到以下错误:

mv: target 'foobar' is not a directory

答案1

您当前的问题是命令替换没有加引号,导致mv命令如下:

mv foo bar foobar

... 其中mv期望“foobar”是文件“foo”和“bar”(可能不存在)的目标目录。您不想通过在命令替换周围加上引号来解决这个问题,因为解析输出是一件ls您不想处理的麻烦事。请考虑:

mkdir $'newline\nhere'

...ls -c | head -1报告为简单的“换行符”而不是正确的名称。

当然,为了解决眼前的问题,只需按照创建目录时的方式引用该目录即可:

mv "foo bar" foobar

如果只有一个错误命名的目录,而您想将其重命名为特定名称,则可以找到匹配的通配符,然后手动重命名。使用 进行测试,ls -d *wildcard*直到只找到一个错误的目录,然后运行:

mv *that-wildcard* the-new-name

如果错误的目录名太难用通配符确定,则可以使用 shell 循环重命名每个包含空格的目录:

for dir in *\ */
do
  [ -e "${dir// /}" ] && continue
  mv -- "${dir}" "${dir// /}"
done

这将生成一个通配符扩展的子目录列表,其中包含空格;目录限制是通过/通配符结尾实现的。然后测试每个目录以查看新名称是否已经存在;如果存在,我们将跳过它以避免破坏文件或将目录移动到其他目录之下。如果我们都清楚了,那么mv将使用参数扩展重命名目录,将每个空格替换为空。

另一种方法是使用 zsh shell 的功能,它可以按修改时间对文件名扩展进行排序(“排序”)。您可以使用以下命令重命名最近修改的包含空格的目录:

zsh -c 'mv -- *\ *(/om[1]) newdir'

这使用了与之前相同的“其中有一个空格”通配符,但添加了“Glob 资格赛”括号中。这些是:

  • /-- 限制匹配目录
  • om-- 按修改时间排序匹配项(最新的在前)

然后我们选择该列表中的第一个条目作为[1]源目录,将其重命名为“newdir”。

相关内容