【发布时间】:2016-03-08 19:46:35
【问题描述】:
我想编写一个脚本,在没有它的文件末尾添加“0”。
这是我写的:
#!/bin/bash
for file in $1
do
echo $file
ls $file | grep "\0$"
if ["$?"="1"]
then
fi
done
我不知道如何以可以重命名的方式定位文件
【问题讨论】:
我想编写一个脚本,在没有它的文件末尾添加“0”。
这是我写的:
#!/bin/bash
for file in $1
do
echo $file
ls $file | grep "\0$"
if ["$?"="1"]
then
fi
done
我不知道如何以可以重命名的方式定位文件
【问题讨论】:
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
这具有报告哪些参数不是目录或不可访问目录的优点。
这种类型的变化无穷无尽;其中一些甚至可能有用。
现在,我想做同样的事情,但是脚本应该重命名不以“
.0”结尾的文件,而不是以“0”结尾的文件,以便它们以“.0”结尾'?
由于修改了结尾,这有点棘手。仅仅使用[!.][!0] 是不够的。例如,如果文件列表包括30、x.0、x0、z.9和z1,则echo *[!.][!0]仅列出z1(省略30、x0和@ 987654345@ 不以.0 结尾)。
我可能会改用这样的东西:
for dir in "${@:-.}"
do
(
cd "$dir" &&
for file in *
do
case "$file" in
(*.0) : skip it;;
(*) mv "$file" "${file}0";;
esac
done
)
done
另一种选择列出了更多 glob 模式:
for dir in "${@:-.}"
do
(cd "$dir" && for file in *[!.][!0] *.[!0] *[!.]0; do mv "$file" "${file}0"; done)
done
请注意,如果您想查找不以 .00 结尾的文件,这将变得非常棘手——将有 7 个 glob 表达式(但 case 变体同样可以直接工作),以及 shopt -s nullglob变得越来越重要(或者您需要[ -f "$file" ] && mv "$file" "${file}.0" 而不是更简单的移动命令)。
【讨论】:
.0 结尾的文件,使它们以.0 结尾?这更复杂,因为识别模式更复杂。请确认我已正确解释您的要求(回复评论)。