如何在一行中修改和剪切(使用相同的模式)字符串列表?

How to rev & cut (using the same pattern) a list of strings in a single line?

我打算编写一个脚本,根据文件名前缀收集文件,并将它们 tar 放在一起(当它们共享相同的前缀时)。 我没有前缀列表,我需要从文件名本身构建它。

文件的名称如下:

top-1.parquet
top-2.parquet
side-1.parquet
side-2.parquet
bot-tom-1.parquet
bot-tom-2.parquet
right-left-1.parquet
right-left-2.parquet

为此,我tar使用了这个脚本。

RMT_PATH_DATA='/home/me/Documents/code/data'

while IFS= read -r -d $'\n' root_name
do
    # Work out tar here
    echo "Working file $root_name"
    ls "$root_name"*.parquet
done < <(find "$RMT_PATH_DATA" -maxdepth 1 -name "*.parquet" -print0 | rev | cut -f 2- -d '-' | rev | sort -zu)

(此脚本或多或少从 SO 上的 复制而来)

最后一行的逻辑是恢复使用 find 和 trim 文件名数字和前缀检索到的文件名列表。 trimming 是首先反转文件名,在反转名称的第二个字段上使用 cut starting(- 是字段分隔符,它可以是在前缀本身中使用了可变次数)。

我的问题出现在 revcut 命令中。 find 命令输出 data 目录中的镶木地板文件列表,但 revcut 似乎只处理列表的第一项,丢弃其他项目。

请问,我怎样才能让他们处理完整列表?

感谢您的帮助! 最佳

PS:我还没有构建tar部分,只做一个echols来检查循环中正在处理的内容。由于出现问题,目前只进行了一次迭代。

问题是您在查找中使用的 -print0 选项。然后找到的项目之间的分隔符是 NUL 而不是换行符。在 中使用了带有 -z 选项的 cut,它对应于 -print0。据我所知,rev 命令没有使用 NUL delemiter 的选项。

好的,正如@Oliver Gaida 强调的那样,print0 有问题。

我最终使用了以下代码,它似乎有效(包含tar命令:))

while IFS= read -r -d $'\n' full_name
do
  find "$RMT_PATH_DATA" -maxdepth 1 -name "$(basename "$full_name")*.parquet" -type f -size +1k -mmin $MOD_TIME | xargs -n 1 basename | tar -cf "${full_name}.tar" -C "$RMT_PATH_DATA" -T - --remove-files
done < <(find "$RMT_PATH_DATA" -maxdepth 1 -name "*.parquet" -type f -size +1k -mmin $MOD_TIME | rev | cut -f 2- -d '-' | rev | sort -u)

现在必须 运行 使用 ssh...