gpt4 book ai didi

linux - 如何编写一个带一个参数(目录名)的 bash shell 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:30 31 4
gpt4 key购买 nike

如何编写一个名为“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”中,使用“for”控制结构循环遍历所有非隐藏文件名在 $1 中的目录名称中。另外,使用命令替换使用“ls $1”而不是模棱两可的文件名,否则您将进入子目录。

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

修改用于创建将放入“文件名”变量的循环值的命令替换。不仅仅是“ls $1”,而是将输出通过管道传递到“grep”。 “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

关于linux - 如何编写一个带一个参数(目录名)的 bash shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40955996/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com