【问题标题】:Copy the files if exist else skip in bash如果存在则复制文件,否则在 bash 中跳过
【发布时间】:2016-11-29 15:55:23
【问题描述】:

我想首先检查我的源位置上的文件是否在日期范围内:如果是,则复制 else 跳过并检查下一个文件。 有人可以帮忙,因为我是 shell 脚本的新手。

【问题讨论】:

  • 我不明白你的剧本。要查找的 -newrmt 参数是什么?日期是文件名的一部分还是搜索最后修改日期?
  • @Derlin,这是一个 GNU 扩展;检查-newerXY 的手册页。
  • 请注意,find 不会找到不存在的文件。您可以通过添加 -type f 排除目录(等),以便仅找到文件。您的引用符号不正确。仅当文件名不包含空格(或制表符或换行符)时,使用 for 表示法才有效。记得引用变量的用途;请记住在日期变量前面加上 $。一般来说,如果你的代码能正常工作,你会得到最好的响应——你的代码没有运行(无效的语法)。
  • 顺便说一句,在 shell 中,“清晰度”通常需要仅次于正确性:对读者来说看起来最简单的东西往往是错误的(尽管经常以逃避简单测试但随后出现的方式出现) ;避免语言中隐藏的陷阱往往需要了解和使用为此目的而存在的成语体。
  • 您可以使用find 查找某个日期范围内的文件。

标签: bash loops unix


【解决方案1】:

find already 将只返回已经存在的条目;那里没有问题,但是您用来迭代其结果的代码严重损坏。


这里的问题不在于跳过,而在于总体上正确的语法,以及(其次)与正确性相关的做法。即使您修复了原始代码中最直接的错误,您也会与BashPitfalls #1DontReadLinesWithFor 发生冲突。

有关使用 find 的最佳实践的完整讨论,请参阅 UsingFind。也就是说,正确的方法包括:

#!/bin/bash
#      ^^^- important: not /bin/sh

while IFS= read -r -d '' filename; do
  mv "$filename" /to_path
done < <(find filedirectory_path/ -type f -newermt "$date1" ! -newermt "$date2" -print0)

...或...

find filedirectory_path/ -type f -newermt "$date1" ! -newermt "$date2" -exec mv '{}' /to_path \;

【讨论】:

  • 谢谢,但我分享的这段代码只是为了说明我需要做什么。我不擅长编写脚本 :)
  • @Ray:不要向我们展示“我需要做什么的图片”。显示认真尝试做你需要做的事情的代码。如果您要让我们努力回答您的问题,请至少自己努力提供体面的代码。否则真的很粗鲁。
  • 我不是故意粗鲁的。我想我在 shell 脚本方面太糟糕了,甚至无法编写语法正确的代码:(
  • @JonathanLeffler,呵呵。我完全是这样读的,以至于在手册页中将 Derlin 指向 -newerXY,但你是对的。
  • @Ray,...正如我将描述的问题,问题在于代码错误,以至于它甚至没有清楚地传达您的意图。我们不介意读者;当你写东西时,我们不知道你脑子里在想什么。我们 bash 专家,所以我们确切地知道shell 会如何解释那个东西,但我们不知道你希望我们 怎么解释它。
猜你喜欢
  • 1970-01-01
  • 2022-11-15
  • 2015-12-02
  • 2014-01-22
  • 2012-04-19
  • 2013-05-22
  • 2016-05-30
  • 2011-06-24
  • 1970-01-01
相关资源
最近更新 更多