我正在尝试重命名名称中带有空格的最近目录。
$ 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”。