如何编写bash shell脚本,该脚本获取一个参数(目录名称)



如何编写称为'abc'的bash shell脚本,该脚本以一个参数,目录的名称,并将扩展名为" .xyz"添加到目录中的所有可见文件中'已经拥有它

我主要编写了更改当前目录中的文件名的代码,但我无法让脚本接受参数(目录名称)并更改该目录的文件名

#!/bin/bash
case $# in
0) echo "No directory name provided" >&2 ; exit 1;;
1) cd "${1}" || exit $?;;
*) echo "Too many parameters provided" >&2 ; exit 1;;
esac
for filename in *
do
echo $filename | grep ".xyz$"
if [ "$?" -ne "0" ]
then mv "$filename" "$filename.old"        
fi
done

其他说明包括;在'ABC'中,使用"用于"控制结构循环遍历所有非隐藏的文件名以$ 1的目录名称中的目录名称。另外,使用命令替代用" LS $ 1"而不是模棱两可的文件名,否则您将下降到子目录中。

编辑:问题的首位已在下面回答,但是第二部分要求我根据以下说明修改自己的代码:

修改用于创建将放入"文件名"变量的循环值的命令替换。不仅将输出输出到" GREP"中,而不仅仅是" LS $ 1"。" GREP"将搜索所有未以" .xyz"结尾的文件名。可以使用" GREP -V"选项轻松完成。通过这种方法,您可以摆脱" Echo ... | Grep ..."和循环内的" If"控制结构,然后简单地进行重命名。

我将如何实现这一目标,因为根据我的理解,下面的答案仅在没有.xyz扩展名的情况下通过文件名进行搜索,但是尚未接受。

您的描述在某些地方还不清楚,所以我走了最明显的:

#!/bin/bash
# validate input parameters
case $# in
    0) echo "No directory name provided" >&2 ; exit 1;;
    1) cd "${1}" || exit $?;;
    *) echo "Too many parameters provided" >&2 ; exit 1;;
esac
shopt -s extglob # Enables extended globbing
# Search for files that do not end with .xyz and rename them (needs extended globbing for 'not match')
for filename in !(*.xyz)
do
    test -f && mv "${filename}" "${filename}.xyz"
done

第二部分的答案是:

#!/bin/bash
for file in $(ls -1 "$1" | grep -v '.old$'); do
mv "$file" "$file.old"
done

我从某个地方

最新更新