【问题标题】:For Loop Breaks after wrapping with Platypus用鸭嘴兽包装后的循环中断
【发布时间】:2017-02-11 04:55:04
【问题描述】:

以下是我正在编写的用于媒体备份的脚本的 sn-p。当从终端命令行调用时,脚本会按预期运行。但是,在使用 Platypus 将脚本包装到应用程序后,会创建目标目录,但不会运行 For 循环,并且不会将媒体复制到目标文件夹。有谁知道我在这里做错了什么??

#!/bin/sh

DEST_PATH=/Volumes/MediaBackup   
mkdir -p $DEST_PATH    
SAVEIFS=$IFS

IFS=$(echo -en "\n\b")

for i in $(find "$PWD" -iname "*.jpg")    
do      
    FILENAME="$(basename $i)"
    MD5="$(md5 -q $i)"
    cp "$i" "$DEST_PATH/$MD5-$FILENAME"
done 

IFS=$SAVEIFS

绅士和/或女士们,谢谢!下面是使用 cmets 的工作脚本。感谢您快速转身。应该在几天前完成。

#!/bin/bash

DEST_PATH=/Volumes/PrivateMain/Media
mkdir -p $DEST_PATH
SAVEIFS=$IFS

IFS=$(printf "\n\b")

for i in $(find "/Users" -iname "*.jpg") 
do
FILENAME="$(basename $i)"
MD5="$(md5 -q $i)"

cp "$i" "$DEST_PATH/$MD5-$FILENAME"

done 

IFS=$SAVEIFS

【问题讨论】:

  • Platypus 是否可能正在更改您当前的工作目录?您明确命名了输出目录,因此它的去向没有歧义,但是如果 $PWD 要更改,您可能会在某个地方 find 出现空。
  • 可能不相关,但请参阅 Bash FAQ 001 了解迭代 find 输出的正确方法。
  • 听起来您是在命令行中使用bash 运行脚本,但在Platypus 包装版本中它是使用/bin/sh 运行的。 echo 在每种情况下都会表现不同。 (即,-e/bin/sh 视为要输出的文字字符串,而不是启用转义字符处理的选项。)使用 printf '\n\b' 代替可移植行为。

标签: bash shell backup platypus


【解决方案1】:
#!/bin/bash

DEST_PATH=/Volumes/PrivateMain/Media
mkdir -p $DEST_PATH
SAVEIFS=$IFS

IFS=$(printf "\n\b")

for i in $(find "/Users" -iname "*.jpg") 
do
FILENAME="$(basename $i)"
MD5="$(md5 -q $i)"

cp "$i" "$DEST_PATH/$MD5-$FILENAME"

done 

IFS=$SAVEIFS

感谢所有提供帮助的人!但是,由于可能会覆盖两个同名文件,我将脚本编辑为如下。

SAVEIFS=$IFS
IFS=$(printf "\n\b")
COUNTER=0;
for i in $(find "/Users" -iname "*.jpg");
do

BASE=`expr "$i" : '.*/\(.*\)\..*'`;
EXT=`expr "$i" : '.*/.*\.\(.*\)'`;
COUNTER=`expr $COUNTER + 1` ;
cp "$i" ""${tardir}"/"$x"/JPG/"$BASE"_"$COUNTER"."$EXT""

done
IFS=$SAVEIFS        

【讨论】:

  • 我想你想要cp "$i" "${tardir}/$x/JPG/${BASE}_$COUNTER.$EXT"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多