在一个终端命令中递归查找名称的所有文件、touch 和 chmod?

在一个终端命令中递归查找名称的所有文件、touch 和 chmod?

我正在尝试运行一个命令来更改所有.DS_Store目录及其所有子目录中的文件递归地

到目前为止,我一直在使用以下命令来查找文件,将其修改日期设置为Jan 1 01:01:01 2001,然后找到它们并将其权限设置为read only用户、组和所有人。

find . -name '.DS_Store' -print0 | xargs -0 sudo touch -t 200101010101
find . -name '.DS_Store' -print0 | xargs -0 sudo chmod 444

我猜测有一种更有效的方法可以使用单个命令来执行此操作,但我不确定如何find在多个后续命令中使用该命令的输出。

理想情况下,如果任何文件/命令遇到任何错误/故障,我希望命令行停止并输出错误消息,而不是继续执行。我在其他地方看到使用&&一行上的命令分隔符可以实现这一点,但我不确定如何将其与命令的输出结合使用find

这个问题是关于我正在尝试完成的一项较大任务的一小部分。除了部分脚本似乎只有在我直接从终端运行时才有效之外,我现在几乎已经完成了所有工作。以下是主要问题的链接,以防有人能提供帮助:对选定文件夹执行一系列命令的服务,以消除 Finder 中 .DS_Store 文件的问题

答案1

您可以使用该-exec选项并将其输出用作子 shell 的参数来实现这一点:

find . -name '.DS_Store' -exec zsh -c 'touch -t 200101010101 "$1" && sudo chmod 444 "$1" || echo "$1" >> errors.txt' zsh {} \;

如您所见,我使用zsh {}将参数传递给zsh -c,这使我能够通过使用 find 的输出$1。请注意,这里需要使用双引号,例如,以避免包含空格的文件名导致问题。

我习惯&&仅在前一个命令没有错误退出时才继续执行下一个命令。

如果发生错误,||允许我在失败时运行命令,例如将文件名写入文件errors.txt

答案2

怎么样:

find . -name '.DS_Store' -exec sudo touch -t 200101010101 {} + -exec sudo chmod 444 {} + -print

(请记住,-exec 和 + 会构建一个以所有文件为参数的单个命令)

相关内容