【问题标题】:How do I iterate over files in a directory in Bash?如何遍历 Bash 目录中的文件?
【发布时间】:2014-10-02 13:11:52
【问题描述】:

我正在尝试遍历目录中的文件列表,对它们进行加密,然后使用 bash 将它们移动到其他地方。这是我目前所拥有的:

for filename in /home/anthony/documents_preprocessed; do 
    gpg --encrypt --recipient anthony@mydomain.org $filename
    mv /home/anthony/$filename /home/anthony/Documents
done

据我了解,这应该可以,但我对 bash 脚本还很陌生。当我运行它时,它从不加密,它只是将文件移动到文档目录。

谁能告诉我这样做的正确方法是什么?

谢谢!

【问题讨论】:

  • for filename in dest/*,而不是for filename in dest"$filename",不是$filename。而且 GnuPG 默认不会覆盖它的输入文件——也就是说它不会就地加密,你可能不希望它这样做;在这种情况下太容易丢失数据。在 gpg 命令行上指定一个输出文件。
  • 另外,“我如何在 bash 中做到这一点?”是一个可怕的问题标题,因为它没有让任何人知道“this”是什么。 StackOverflow 的部分目标是建立一个可重用的知识库,以便其他人可以从问题和答案中学习;标题为“我如何在 bash 中执行此操作?”的问题对那个基础没有有用的贡献。
  • 如果真正的问题是如何迭代目录内容,那么这是一个骗局:stackoverflow.com/questions/21954516/…stackoverflow.com/questions/20796200/…stackoverflow.com/questions/1732861/… 等。

标签: bash


【解决方案1】:

使用 glob 展开目录中的所有文件:

for filename in /home/anthony/documents_preprocessed/*; do 
    gpg --encrypt --recipient anthony@mydomain.org "$filename"
    mv "/home/anthony/$filename" /home/anthony/Documents
done

您可以并且应该首先执行shopt -s nullglob,如果没有匹配的文件,这将使循环运行 0 次而不是 1 次。

PS:shellcheck 自动指出此类常见问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2021-01-16
    • 1970-01-01
    • 2011-08-05
    • 2017-06-05
    • 2011-06-22
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多