是否可以使用 {1..10} 重命名带有序列号的文件

是否可以使用 {1..10} 重命名带有序列号的文件

我有疑问。我必须使用序列号 1 到 10 重命名该文件。我可以使用以下参数创建一个文件。

touch file.$(date +%Y).$$.{1..10}

但我无法使用以下命令重命名该文件。为什么 {1..10} 不被接受。因为我想将文件重命名为。 mv 命令将采用 {1..10} ?

file.201704.<PID>.1
file.201704.<PID>.2
.
.
.
.

那么下面的命令是正确的吗?

for file in $(ls);
do

mv $file file.$(date +%Y%m).$$.{1..10}
done

答案1

大括号扩展{1..10}将导致命令行扩展以包含多个参数。

例如,touch命令行将扩展为类似

touch file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10

在被处决之前。这是可以的,因为该touch实用程序在命令行上接受任意数量的参数。注意:这将创建 10 个文件,而不是 1 个文件。

然而,与 相比,该mv实用程序具有不同的语义touch。它期望最后有一个或多个源文件/目录和一个目标文件/目录。

这意味着当

mv $file $file.$(date +%Y%m).$$.{1..10}

扩展到类似的东西

mv file file.2017.5878.1 file.2017.5878.2 file.2017.5878.3 file.2017.5878.4 file.2017.5878.5 file.2017.5878.6 file.2017.5878.7 file.2017.5878.8 file.2017.5878.9 file.2017.5878.10

假设您想搬家全部文件,除了命令行上的最后一个内容。此外,它还期望命令行上的最后一个内容是目录名称(因为您要移动多个内容)。

我不清楚您在该循环中实际想要做什么,因此我无法进一步评论如何解决此问题。

当谈到循环本身时,永远不要使用ls这样的输出。相反,做

for file in ./*; do
    # process "$file"
done

的输出ls是让你看着,由于多种原因,它不适合脚本使用。看http://unix.stackexchange.com/questions/128985/why-not-parse-ls

另外,始终用双引号引用变量。看http://unix.stackexchange.com/questions/171346/security-implications-of-forgetting-to-quote-a-variable-in-bash-posix-shells

相关内容