问题描述
我打算编写一个脚本,该脚本根据文件名前缀收集文件,并将它们压缩在一起(当它们共享相同的前缀时)。 我没有前缀列表,我需要从文件名本身构建它。
文件的名称如下:
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
为此,我从此脚本开始。
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上的retained answer here复制而来的)
最后一行的逻辑是还原用find
检索的文件名列表,并修剪文件名的数字和前缀。
修剪是通过首先反转文件名来进行的,使用cut
从反转名称的第二个字段开始(-
是字段定界符,并且前缀本身可以多次使用)
我的麻烦出现在rev
和cut
命令中。
find
命令输出data
目录中的实木复合地板文件列表,但是rev
和cut
似乎仅处理列表的第一项,而丢弃其他项。 / p>
请,我如何让他们处理完整列表?
感谢您的帮助! 最好的
PS:我尚未构建tar
部分,仅执行echo
和ls
来检查循环中正在处理的内容。由于存在麻烦,目前仅执行一次迭代。
解决方法
问题是您在查找中使用的-print0选项。那么找到的项目之间的传递者是NUL,而不是换行符。在How to concatenate files that have the same beginning of a name?中,使用带有-z选项的cut,这与-print0相对应。就我所知,rev命令没有使用NUL delemiter的选项。
,好吧,如@Oliver Gaida所强调的,x = np.random.randint(0,10,size=(30,32,10000))
%timeit np.save('data.npy',x)
%timeit np.load('data.npy')
%timeit np.savez_compressed('data.npz',array=x)
%timeit np.load('data.npz')['array']
153 ms ± 42.1 ms per loop (mean ± std. dev. of 7 runs,10 loops each)
35.7 ms ± 3.59 ms per loop (mean ± std. dev. of 7 runs,10 loops each)
2.57 s ± 209 ms per loop (mean ± std. dev. of 7 runs,1 loop each)
163 ms ± 18.7 ms per loop (mean ± std. dev. of 7 runs,10 loops each)
遇到了麻烦。
我最终使用了似乎可以正常工作的以下代码(包括tar命令:))
print0
现在必须使用ssh运行它...