我必须在 Ubuntu 上制作一个脚本,它将路径目录指定的所有文件重命名为大写。我已经找到了一个将重命名文件的循环,但我不确定如何将路径传递给该循环。你能帮助我吗?
这是循环:
for f in *; do
mv "$f" "$f.tmp";
mv "$f.tmp" "`echo $f | tr "[:lower:]" "[:upper:]"`";
done
我尝试过像这样通过路径
for f in path_to_dir* ...
但它的作用只是以某种方式创建一个目录 .tmp
答案1
我会做类似的事情:
#! /bin/zsh -
ret=0
autoload zmv
for dir do
(cd -P -- "$dir" && zmv '*(#qN)' '$f:u') || ret=$?
done
exit "$ret"
该脚本被称为:
that-script /path/to/dir /path/to/other/dir...
答案2
我怀疑你做了类似的事情for f in /path/to/dir*
而不是/path/to/dir/*
。前者将查找/path/to
名称以 开头的文件和目录dir
,而后者将迭代目录的内容。
无论如何,这对您没有帮助,因为tr
您使用的命令会改变一切,包括/path/to/dir
大写,留给你的/PATH/TO/DIR
是不存在的。好消息是您可以通过更简单的方式做到这一点。
如果您使用的是 bash,则可以使用${var^^}
使变量的内容变为大写。所以你可以这样做:
for f in /path/to/dir/*; do
## get the file's name
name=$(basename -- "$f")
## make the new name
mv -- "$f" /path/to/dir/"${name^^}"
done
或者,为了避免两次输入目录名称,您可以将其保存在变量中:
targetPath="/path/to/dir"
for f in "$targetPath"/*; do
## get the file's name
name=$(basename -- "$f")
## make the new name
mv -- "$f" "$targetPath"/"${name^^}"
done
cd
然而,在这种情况下,直接进入目标目录并在那里工作会更简单、更清晰:
targetPath="/path/to/dir"
cd -- "$targetPath" &&
for f in *; do
mv -- "$f" "${f^^}"
done
或者,为了避免最终进入新目录,请在子 shell 中运行循环:
targetPath="/path/to/dir"
( cd -- "$targetPath" &&
for f in *; do
mv -- "$f" "${f^^}"
done
)
最后,您还可以使用以下命令来完成所有这些操作perl-rename
(在 Ubuntu 上称为rename
并可使用 进行安装sudo apt install rename
):
rename -n 's|([^/]+)$|uc($1)|e' /path/to/dir/*
制造-n
商rename
只是打印出它会做什么而不做它。如果您对它的工作感到满意,请再次运行它,而无需-n
实际重命名文件。