我有疑问。我必须使用序列号 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