繁体   English   中英

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

[英]How to write a bash shell script which takes one argument (directory name)

如何编写一个名为'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”而不是模糊文件名,或者您将进入子目录。

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

修改用于创建将放入“filename”变量的循环值的命令替换。 而不只是“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

第二部分的答案是:

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

我是从某个地方得到的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM