我非常擅长使用脚本编写脚本,而且我的作业脚本中已经没有了想法。
该脚本需要4个参数 - pathToDirectory,[ - c / -m / -r] == copy / move / remove,ext1和ext2(运行脚本的示例:script.sh / home / user / somefolder -c a.txt b.sh)。
该脚本应该找到包含' a.txt'的/ home / user / someFolder(及其所有子文件夹)中的所有文件。在他们的名字和(在-c和-m情况下)重命名' a.txt'部分到' b.sh'并且依赖于-c / -m参数或者创建一个新文件或者只是重命名一个现有文件(在-r情况下它只是删除文件)然后写入stdout类似于' old name =>新名称'。
上述脚本的示例输出:
/home/user/someFolder/bbb.txt => /home/user/someFolder/bba.txt
嗯,这不是一个实现的问题,一切顺利,直到我将我的代码发布到我们的上传系统(评估我们的脚本)。
第一个上传系统尝试运行我的脚本看起来像" script.sh / something / graph 1 -c .jpg .jpeg"。
现在的问题是,整个' / something / graph 1'是一条路径,在' 1'之前是空白毁了这一切。
预期产出:./projekty/graph 1.jpg => ./projekty/graph 1.jpeg
我的脚本输出:./projekty/graph => ./projekty/graph.jpeg
1.jpg => 1.jpeg
到目前为止我所拥有的:
if [ "$2" = "-r" ]; then
for file in $(find $1 -name "*$3"); do
echo $file
rm -f $file
done
elif [ "$2" = "-c" ]; then
for file in $(find "$1" -name "*$3") ; do
cp "$file" "${file//$3/$4}"
echo $file "=>" ${file%$3}$4
done
elif [ "$2" = "-m" ]; then
for file in $(find $1 -name "*$3"); do
mv "$file" "${file//$3/$4}"
echo $file "=>" ${file%$3}$4
done
else
echo Unknown parameter >&2
fi
我的尝试& notworking&可能是愚蠢的想法:因为-r / -c / -m参数应该是2美元,我能够检测到$ 2是其他东西(假设仍然属于路径的东西)并追加2美元到1美元,所以我有一个变量DIR,这是整个路径。使用shift我将所有参数移动到左侧(因为空格,-r / -m / -c参数不是2美元但是3美元,所以我再次获得$ 2)然后代码看起来像:(只是-c部分)
DIR=$1
if [ "$2" != "-r" ] && [ "$2" != "-c" ] && [ "$2" != "-m" ]; then
DIR+=" $2"
shift
fi
if [ "$2" = "-c" ]; then
for file in $(find "$DIR" -name "*$3") ; do
cp "$file" "${file//$3/$4}"
echo $file "=>" ${file%$3}$4
done
fi
当我回应" $ DIR"时,它显示了整个路径(正确),但它仍然没有工作.. 有没有其他/更好/任何方式如何解决这个问题? :/
提前致谢!
答案 0 :(得分:1)
由于目标字符串只需要在文件名的最末端替换,"${file//$3/$4}"
是个坏主意。
示例:./projekty/graph.jpg.jpg.jpg.graph.jpg
将一个容易出现不带引号扩展的字符串传递给循环也不是一个好主意。
事实是find
按预期工作,其输出如下:
./projekty/graph 1.jpg
但是在循环内部它被错误地扩展:
./projekty/graph
1.jpg
为避免这种情况,您可以将find
的输出保存到变量中,然后对其进行标记,直到没有文本为止:
list="$(find $1 -name "*$3")"
while [ -n "$list" ]; do
file="${list%%$'\n'*}"
list="${list#$file}"
list="${list#$'\n'}"
# your commands here
# ...
done