【问题标题】:Rename the most recent file in each group重命名每个组中的最新文件
【发布时间】:2018-05-02 19:17:48
【问题描述】:

我尝试创建一个脚本来检测每个组的最新文件,并为其原始名称添加前缀。

ll $DIR
asset_10.0.0.1_2017.11.19 #latest
asset_10.0.0.1_2017.10.28
asset_10.0.0.2_2017.10.02 #latest
asset_10.0.0.2_2017.08.15
asset_10.1.0.1_2017.11.10 #latest
...

2 个问题:

1)如何找到每个组的最新文件?

2)如何重命名只添加前缀

我尝试了以下过程,但它在整个目录中查找最新文件,并且不保留原始名称为其添加前缀:

find $DIR -type f ! -name 'asset*' -print | sort -n | tail -n 1 | xargs -I '{}' cp -p '{}' $DIR...

实现这一目标的最佳方法是什么? (尽可能保留 xargs)

【问题讨论】:

标签: linux bash shell


【解决方案1】:

如果您想单独在 bash 中执行此操作,而不是使用 findsort 等外部工具,则需要解析每个文件名中的“字段”。

这样的事情可能会奏效:

declare -A o=()                         # declare an associative array (req bash 4)

for f in asset_*; do                    # step through the list of files,
  IFS=_ read -a a <<<"$f"               # assign filename elements to an array
  b="${a[0]}_${a[1]}"                   # define a "base" of the first two elements
  if [[ "${a[2]}" > "${o[$b]}" ]]; then # compare the date with the last value
    o[$b]="${a[2]}"                     # for this base and reassign if needed
  fi
done

for i in "${!o[@]}"; do                 # now that we're done, step through results
  printf "%s_%s\n" "$i" "${o[$i]}"      # and print them.
done

这并不完全是排序,它只是遍历文件列表并获取每个文件名基数的最高排序值。

【讨论】:

  • 太棒了!这个任务太重了,但你肯定给我留了一个未来的问题,因为这是我试图为另一项任务“做饭”的东西。再次感谢
【解决方案2】:

选择每个组中的最新条目

您可以使用sort 仅选择每个组中的最新条目:

find . -print0 | sort -r -z | sort -t_ -k2,2 -u -z | xargs ...

首先,按相反的字典顺序对所有文件进行排序(以便最新条目出现每个组的第一个)。然后,通过仅对组名进行排序(即第二个字段-k2,2,当通过-t_ 以下划线拆分时)并打印唯一组,我们仅获得每个组的第一个条目,这也是最新的。

请注意,这是因为sort 使用稳定排序 算法 - 这意味着顺序或已排序的项目不会因再次排序而改变。另请注意,我们不能在此处使用 uniq,因为我们无法为 uniq 指定自定义字段分隔符(它始终是空格)。

带前缀复制

要为找到的每个文件名添加前缀,我们需要将每个 path find 生成一个目录和一个文件名(基本名),因为我们只需要在文件名中添加prefix。上面的xargs 部分可能如下所示:

... | xargs -0 -I '{}' sh -c 'd="${1%/*}"; f="${1##*/}"; cp -p "$d/$f" "$d/prefix_$f"' _ '{}'

路径拆分是用shell parameter expansion完成的,即前缀(${1##*/})和后缀(${1%/*}substring removal


注意在find 中使用NUL-终止输出(路径)(-print0 而不是-print),以及在sort 和@987654343 中伴随使用-z-0 @。这样,完整的管道将正确处理带有“特殊”字符(如换行符等)的文件名(路径)。

【讨论】:

  • 很酷! (但看起来 OP 需要更多帮助才能正确添加前缀。)
  • 谢谢,我也会添加。
  • 非常感谢!采用这种方法:)
猜你喜欢
  • 2012-06-01
  • 2019-06-02
  • 2012-01-27
  • 2013-07-14
  • 2019-07-19
  • 2019-05-20
  • 2021-09-28
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多