如何编写名为' abc'的bash shell脚本。它接受一个参数,一个目录的名称,并添加扩展名" .xyz"到目录中尚未拥有它的所有可见文件
我大部分编写的代码更改了当前目录中的文件名但我无法让脚本接受参数(目录名)并更改该目录的文件名 < / p>
#!/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
其他说明包括; 在&#39; abc&#39;中,使用&#34; for&#34;控制结构循环遍历所有非隐藏文件名 在$ 1的目录名称中。另外,使用命令替换 用&#34; ls $ 1&#34;而不是模糊的文件名,或者你会下降到子目录。
编辑:问题的上半部分已在下面得到解答,但第二部分要求我根据以下说明修改自己的代码:
修改用于创建将放入&#34;文件名&#34;的循环值的命令替换。变量。而不仅仅是&#34; ls $ 1&#34;,将输出传输到&#34; grep&#34;。 &#34; grep&#34;将搜索所有不以#34; .xyz&#34;结尾的文件名。这可以通过&#34; grep -v&#34;轻松完成。选项。通过这种方法,您可以摆脱&#34; echo ... | grep ...&#34;和#34;如果&#34;控制循环内部的结构,只需重命名即可。
我将如何实现这一点,因为根据我的理解,下面的答案已经只搜索没有.xyz扩展名的文件名,但是它没有被接受。
答案 0 :(得分:0)
您的描述在某些地方有点不清楚,所以我最明显的是:
#!/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
答案 1 :(得分:0)
第二部分的答案是:
#!/bin/bash
for file in $(ls -1 "$1" | grep -v '\.old$'); do
mv "$file" "$file.old"
done
我是从某处获得的