如何在一行中修改和剪切(使用相同的模式)字符串列表?
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(-
是字段分隔符,它可以是在前缀本身中使用了可变次数)。
我的问题出现在 rev
和 cut
命令中。
find
命令输出 data
目录中的镶木地板文件列表,但 rev
和 cut
似乎只处理列表的第一项,丢弃其他项目。
请问,我怎样才能让他们处理完整列表?
感谢您的帮助!
最佳
PS:我还没有构建tar
部分,只做一个echo
和ls
来检查循环中正在处理的内容。由于出现问题,目前只进行了一次迭代。
问题是您在查找中使用的 -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...
我打算编写一个脚本,根据文件名前缀收集文件,并将它们 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(-
是字段分隔符,它可以是在前缀本身中使用了可变次数)。
我的问题出现在 rev
和 cut
命令中。
find
命令输出 data
目录中的镶木地板文件列表,但 rev
和 cut
似乎只处理列表的第一项,丢弃其他项目。
请问,我怎样才能让他们处理完整列表?
感谢您的帮助! 最佳
PS:我还没有构建tar
部分,只做一个echo
和ls
来检查循环中正在处理的内容。由于出现问题,目前只进行了一次迭代。
问题是您在查找中使用的 -print0 选项。然后找到的项目之间的分隔符是 NUL 而不是换行符。在
好的,正如@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...