我有一个图像文件夹。我想迭代文件夹,将相同的ImageMagick转换函数应用于每个文件,并将输出保存到单独的文件夹。
我现在这样做的方式是:
#!/bin/bash
mkdir "Folder2"
for f in Folder1/*.png
do
echo "convert -brightness-contrast 10x60" "Folder1/$f" "Folder2/"${f%.*}"_suffix.png"
done
然后我将该终端输出复制并粘贴到一个新的bash脚本中,最终看起来像这样:
#!/bin/bash
convert -brightness-contrast 10x60 Folder1/file1.png Folder2/file1_suffix.png
convert -brightness-contrast 10x60 Folder1/file2.png Folder2/file2_suffix.png
convert -brightness-contrast 10x60 Folder1/file3.png Folder2/file3_suffix.png
我尝试为这个任务写一个单独的bash脚本,但是变量处理有一些奇怪,这个双脚本方法让我得到了我需要的东西......但我怀疑有一种更简单/更简单的方式甚至可能一线解决方案。
答案 0 :(得分:0)
检查this answer(以及问题中的少数几个):
您可以在示例中使用它:
find Folder1 -name "*.png" | sed -e 'p;s/Folder1/Folder2/g' -e 's/.png/_suffix.png' | xargs -n2 convert -brightness-contrast 10x60
注意:第一个sed中的p成功。
find
会列出Folder1
中名称与* .png表达式相匹配的所有文件
sed -e 'p;/Folder1/Folder2/g'
将(a)打印输入行,(b)将Folder1
替换为Folder2
-e 's/.png$/_suffix.png'
将.png
后缀替换为_suffix.png
后缀
xargs -n2
告诉shell,xargs应该最多接受两个参数(第一个由sed 'p'
打印,第二个参数遍历所有-e
)
convert ...
是你的命令,有两个输入。
答案 1 :(得分:0)
足以改变你的第一个脚本,不只是回显命令,而是执行它们。
#!/bin/bash
mkdir "Folder2"
for f in Folder1/*.png
do
convert -brightness-contrast 10x60 "Folder1/$f" "Folder2/${f%.*}_suffix.png"
done
答案 2 :(得分:0)
水晶球告诉我文件名中有空格导致“变量处理有些奇怪”。在这种情况下,您需要一个空间的解决方法。例如,您可以尝试以下脚本:
#!/bin/bash
hasspaces="^(.+[^\'\"])([ ])(.+)$"
function escapespaces {
declare -n name=$1
while [[ $name =~ $hasspaces ]] ; do
name=${BASH_REMATCH[1]}'\'${BASH_REMATCH[2]}${BASH_REMATCH[3]}
echo 'Escaped string: '\'$name\'
done
}
mkdir Folder2
while read -r entry; do
echo "File '$entry'"
escapespaces entry
echo "File '$entry'"
tmp=${entry#Folder1}
eval "convert -brightness-contrast 10x60" "$entry" "Folder2/"${tmp%.*}"_suffix.png"
done <<<"$(eval "ls -1 Folder1/*.png")"
如果这不起作用,请务必告诉我,以便我可以申请退还我的水晶球!此外,如果您可以提供有关“变量处理中的怪异”的更多详细信息,我们可以尝试帮助解决其他奇怪问题: - )