如何在脚本中循环浏览一些文件?

时间:2012-06-07 18:13:48

标签: linux bash loops for-loop

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

我有一个脚本:

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文件夹可以使用它试。

非常感谢任何帮助。我是新手,所以我不知道从哪里开始。

谢谢!

3 个答案:

答案 0 :(得分:2)

您的问题有点难以解析,但我认为您并不真正理解shell globslooping constructs。根据现在的内容扩展了整体,而不是之前或之后的内容。

DIR=$(mktemp -d)
mv ~/Desktop/File_Converted/* "$DIR"
cd "$DIR"
for file in *; do
    : # whatever you want to do to "$file"
done

答案 1 :(得分:2)

您不需要LIFO - 针对不同事件运行的脚本的多个副本不会与其变量名称发生冲突。他们 冲突的是共享的临时目录,每次运行脚本时,都应该使用mktemp -d创建一个具有新的,唯一的,保证非冲突名称的临时目录。 / p>

tempdir=$(mktemp -t -d mytemp.XXXXXX)
mv ~/Desktop/File_Converted/* "$tempdir"
cd "$tempdir"
for f in *; do
  ...whatever...
done

答案 2 :(得分:-1)

您所描述的是经典竞争条件,其中不清楚在冲突操作开始之前一个操作将完成。这些都不容易处理,但是你会通过处理脚本和编程来学到很多东西,这样做非常值得,即使仅仅是为了学习。

我建议您首先查看lockfileflock联机帮助页。尝试一些实验。看起来你可能对此有正确的天赋,因为你正在问正确的问题。

顺便说一下,我怀疑你想杀死<{p>中的$

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

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