脚本将重命名路径目录指定的所有文件

脚本将重命名路径目录指定的所有文件

我必须在 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/*

制造-nrename只是打印出它会做什么而不做它。如果您对它的工作感到满意,请再次运行它,而无需-n实际重命名文件。

相关内容