![](/img/trans.png)
[英]How to write a script for bash to archive a directory and keep its name?
[英]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.