【问题标题】:How can I loop through some files in my script?如何循环浏览脚本中的某些文件?
【发布时间】:2012-06-07 18:13:48
【问题描述】:

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

我有一个脚本:

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 文件夹的下一个文件可以使用它再次。

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

谢谢!

【问题讨论】:

  • 听起来像后进先出法。不,我不知道如何在 bash 中做到这一点。
  • 变量一旦被赋值就不会改变它们的值而没有被明确地重新赋值——添加一个新文件不会修改一个已经存在于变量中的 glob 的结果——并且也是唯一的单个脚本执行(因此同一脚本的两个副本可以在$FILE1 中具有两个不同的值;它们不会相互更改)。现在,如果共享的 临时目录 被踩踏,那就更有意义了。
  • 您的 AppleScript、inotify、cron 作业或任何可以启动脚本的东西。如果您使用 mktemp,您将不必担心并发运行会相互干扰。

标签: linux bash loops for-loop


【解决方案1】:

您的问题有点难以解析,但我认为您并没有真正理解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

【讨论】:

  • 感谢您的回答!如果我猜对了,脚本可以通过放入一个文件来启动,如果另一个文件被放入文件夹并且脚本的另一个实例被启动,那么该脚本实例的变量实例将不会改变.这使事情变得简单。谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    我建议您首先查看 lockfileflock 联机帮助页。尝试一些实验。看起来你可能有合适的能力,因为你问的问题完全正确。

    对了,我怀疑你是想杀了$中的

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多