2

我在这方面非常初学者,并且已经搜索了我的问题的答案,但没有找到任何我理解如何实施的答案。任何帮助将不胜感激。

我有一个脚本:

FILE$=`ls ~/Desktop/File_Converted/`
mkdir /tmp/$FILE
mv ~/Desktop/File_Converted/* /tmp/$FILE/

所以我可以使用 Applescript 来说明何时将文件放入此桌面文件夹,创建一个临时目录,将文件移动到那里并做其他事情。然后我删除临时目录。就目前而言,这很好,但问题是,如果在我对当前正在使用的文件执行操作之前将另一个文件放入 File_Converted 目录,它将在脚本之前更改 $FILE 变量的值完成对当前文件的操作。

我想做的是使用一个变量设置,变量是$FILE1。我检查是否定义了 $FILE1,如果没有,则使用它。如果已定义,则尝试 $FILE2 等... 最后,当我完成后,我想回收变量,以便 $FILE1 再次设置回 null 并且放入 File_Converted 文件夹的下一个文件可以使用它再次。

任何帮助将不胜感激。我是新手,所以我不知道从哪里开始。

谢谢!

4

3 回答 3

2

您的问题有点难以解析,但我认为您并没有真正理解shell glob循环构造。球团是根据现在的情况进行扩展的,而不是根据之前或以后可能存在的情况。

DIR=$(mktemp -d)
mv ~/Desktop/File_Converted/* "$DIR"
cd "$DIR"
for file in *; do
    : # whatever you want to do to "$file"
done
于 2012-06-07T18:34:08.493 回答
2

您不需要 LIFO - 为不同事件运行的脚本的多个副本不会在它们的变量名上发生冲突。它们冲突的是共享临时目录,您应该mktemp -d在每次运行脚本时使用新的、唯一且保证不冲突的名称创建一个临时目录。

tempdir=$(mktemp -t -d mytemp.XXXXXX)
mv ~/Desktop/File_Converted/* "$tempdir"
cd "$tempdir"
for f in *; do
  ...whatever...
done
于 2012-06-07T18:40:35.237 回答
-1

您所描述的是一种经典的竞争条件,其中不清楚一个操作是否会在冲突操作开始之前完成。这些并不容易处理,但是通过处理它们,您将学到很多关于脚本和编程的知识,因此即使只是为了学习,也值得付出努力。

我建议您首先查看lockfileflock联机帮助页。尝试一些实验。看起来您可能对此具有正确的才能,因为您提出的问题完全正确。

顺便说一句,我怀疑你想杀$

FILE$=`ls ~/Desktop/File_Converted/`

顺便说一句,@CharlesDuffy 正确地观察到“ls在脚本中使用表明某些事情本身做错了。请参阅mywiki.wooledge.org/ParsingLsmywiki.wooledge.org/BashPitfalls。” 有人怀疑建议的lockfile练习将清除这两点,尽管可能需要几个小时才能完成它。

于 2012-06-07T18:24:07.393 回答