在循环中从一个较大的目录中复制文件。

问题描述 投票:0回答:1

如果问题非常基本,我提前道歉。

我需要将一些文件从一个位置复制到另一个位置。我试图用bash写一个脚本来自动完成这个过程。为了使成一个循环,我使用了一个列表和通配符,因为文件的命名是不一致的。我所拥有的是(请注意'应该是`)。

for subject in cat 'subjects_list.txt' ; do
    cp /input/$subject/*_task/*_task-file.nii /output/$subject/dir1/${subject}_task-file.nii
done

这一切都很好,问题是有时在一个主题目录下有2个名为 "*_task "的目录,每个目录都有一个文件*_task-file.nii。但是,其中一个文件并不完整,但由于通配符的存在,脚本会同时抓取两个文件。我想在我的脚本中添加一种方法来检查是否有多个名为task的目录,如果有,则抓取*_task-file.nii,并丢弃另一个--更大的文件应该意味着文件是完整的)。我知道我可以使用 wc -c $file 来检查文件的大小.但是, 我不知道有什么最简单的方法(我的bash知识很基础)可以在我的脚本中写成只复制大小较大的文件. 然而,我不知道什么是最简单的方法(我的bash知识非常基础),在我的脚本中写下只复制较大的文件。如果有谁能告诉我正确的方向,让我可以写一个脚本,我将非常感激。

谢谢你

bash loops cp
1个回答
0
投票

什么是最简单的方法(我的bash知识是非常基本的),写在我的脚本中,只复制更大的文件。

  • 把文件打印成一个有文件名和大小的列表。stat.
  • sort 获取列表中最后一个(或第一个,取决于排序顺序)元素。
  • 获取列表中的最后一个(或第一个,取决于排序顺序)元素。tailhead
  • 提取文件名 cut
  • 复制该元素。

沿的东西。

file_with_greatest_size=$(
    stat -c '%s %n' /input/$subject/*_task/*_task-file.nii |
    sort -k1n |
    tail -n1 |
    cut -d' ' -f2-
)
cp "$file_with_greatest_size" /destination

# with xargs it could be just: 
#     | xargs -d'\n' -I{} cp {} /destination
# without a temporary variable

注意:

© www.soinside.com 2019 - 2024. All rights reserved.