我正在编写一个bash脚本,该脚本应该按照部分名称将照片分类到文件夹。 这个问题给了我很多错误,我找不到错误。即使是ShellCheck也没有找到任何东西。如果你们这些人可以帮助我,那就太好了。
我的剧本:
#!/bin/bash
Total=$(ls -1 | wc -l)
echo "$Total"
Count=1
while [[ $Count < $Total ]]
do
NameOut=$(ls -1 | grep -o '[^-]*,[^-]*' | sed -n "$Count"p)
echo "$NameOut"
Filename=$(ls -1 | sed -n "$Count"p)
echo "$Filename"
if [ -d "$NameOut" ]; then
mv "$Filename" "$NameOut"/
Count=$((Count + 1))
else
mkdir "$NameOut"
mv "$Filename" "$NameOut"/
Count=$((Count + 1))
fi
done
该脚本由于某种原因尝试移动脚本本身并且它不会创建文件夹 - 并且无法移动文件,因为没有文件夹可以移动它们。 它自己包含的目录如下所示:
ls -1
REZ-Name,Surname-02-12-1996.jpg
BLEACH-Name,Surname-04-08-2008.jpg
答案 0 :(得分:1)
shellcheck确实识别了这个脚本的几个问题。
这个脚本也非常低效,因为当它不需要这样做时,它会反复循环遍历文件的内容。
一系列文件名将是更多更好的方式来执行此任务。
话虽如此,这与你列出的错误没有任何关系。
您的脚本问题是print
行。
你期待他们做什么?
echo
行已经打印出您的变量值。你的意思是printf '%s\n' "$var"
吗? (这只会复制echo
行输出?)
print
完全是一个不同的命令,并试图弄清楚如何打印你给它的参数(如打印机等)。
未经测试但是这样的事情可能会做你想要的。 grep
的剩余使用几乎可以肯定地被替换,但是没有看到代表性的输入和输出,这不太可能偏离初衷。
#!/bin/bash
files=(*)
total=${#files[@]}
echo "$total"
count=1
while (( count < total )); do
filename=${files[count - 1]}
echo "$filename"
nameout=$(echo "$filename" | grep -o '[^ ]*,[^ ]*')
mkdir -p "$nameout"
mv "$filename" "$nameout/"
count=$((count + 1))
done