以脚本中最简单的方式重命名目录中的文件

时间:2015-12-04 00:24:05

标签: unix rename

我想编写一个脚本,在没有它的文件的末尾添加'0'。

这就是我写的:

#!/bin/bash
for file in $1
do
    echo $file

    ls $file | grep "\0$"

    if ["$?"="1"] 
    then

    fi

done

我不知道如何以我可以重命名的方式定位文件

1 个答案:

答案 0 :(得分:1)

for file in *[!0]; do mv "$file" "${file}0"; done

对于未结束0的每个名称,请将其重命名。请注意,这会处理带有空格等的名称。

  

我想给脚本一个目录,它会重命名其中不以0结尾的文件。我怎样才能以一种方式使用它来告诉脚本使用哪个目录?

因此,使用单个目录进行微不足道的必要更改(如果指定了多个目录,则不拒绝命令行;只是静静地忽略附加内容):

for file in "${1:?}"/*[!0]; do mv "$file" "${file}0"; done

"${1:?}"表示法确保$1已设置且不为空,如果不是,则会生成错误消息。你也可以改为写"${1:-.}";这将在当前目录而不是远程目录上工作。然后,glob会在该目录中生成不以0结尾的文件名列表,并重命名它们。如果您有Bash,则可以使用shopt -s nullglob如果目录中没有没有0后缀的文件,您将不会遇到问题。

你可以推广处理任意数量的参数(所有参数都应该是目录,如果没有指定目录,则默认为当前目录):

for dir in "${@:-.}"
do
    for file in "$dir"/*[!0]; do mv "$file" "${file}0"; done
done

或(强制目录):

for dir in "${@:-.}"
do
    (cd "$dir" && for file in *[!0]; do mv "$file" "${file}0"; done)
done

这样做的好处是报告哪些参数不是目录,或者是不可访问的目录。

可以做出这种无穷无尽的变化;其中一些甚至可能有用。

  

现在,我想做同样的事情,但是,脚本应该重命名不以' {{1结尾的文件,而不是以' 0'结尾的文件。 }}'这样他们就会以' .0'?

结束

由于修订后的结尾,这有点棘手。仅使用.0是不够的。例如,如果文件列表包含[!.][!0]30x.0x0z.9,则z1仅列出{{} 1}}(省略echo *[!.][!0]z130,但不以x0结尾。)

我可能会使用类似的东西:

z.9

另一个替代方案列出了更多的glob模式:

.0

请注意,如果你想查找不结束for dir in "${@:-.}" do ( cd "$dir" && for file in * do case "$file" in (*.0) : skip it;; (*) mv "$file" "${file}0";; esac done ) done 的文件,这会很快变得更加棘手 - 会有7个glob表达式(但for dir in "${@:-.}" do (cd "$dir" && for file in *[!.][!0] *.[!0] *[!.]0; do mv "$file" "${file}0"; done) done 变体会同样直接地工作),并且.00变得越来越重要(或者您需要case而不是更简单的移动命令。)