如果问题非常基本,我提前道歉。
我需要将一些文件从一个位置复制到另一个位置。我试图用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知识是非常基本的),写在我的脚本中,只复制更大的文件。
stat
.sort
获取列表中最后一个(或第一个,取决于排序顺序)元素。tail
或 head
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
注意:
$(...)
代替。过时和过时的语法for i in cat
是一个常见的 反bash中的模式。如何在bash中逐行读取文件。.